Skip to content

Commit 2befb94

Browse files
committed
[Xtensa] Implement XtensaNullTargetStreamer
It fixes crash in Xtensa AsmParser::run() during ModuleSummaryIndexAnalysis pass.
1 parent ba0c330 commit 2befb94

File tree

4 files changed

+21
-8
lines changed

4 files changed

+21
-8
lines changed

llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class XtensaAsmParser : public MCTargetAsmParser {
5454
SMLoc getLoc() const { return getParser().getTok().getLoc(); }
5555

5656
XtensaTargetStreamer &getTargetStreamer() {
57+
assert(getParser().getStreamer().getTargetStreamer() &&
58+
"do not have a target streamer");
5759
MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
5860
return static_cast<XtensaTargetStreamer &>(TS);
5961
}

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ createXtensaObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
8585
return new XtensaTargetELFStreamer(S);
8686
}
8787

88+
static MCTargetStreamer *createXtensaNullTargetStreamer(MCStreamer &S) {
89+
return new XtensaTargetStreamer(S);
90+
}
91+
8892
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeXtensaTargetMC() {
8993
// Register the MCAsmInfo.
9094
TargetRegistry::RegisterMCAsmInfo(getTheXtensaTarget(), createXtensaMCAsmInfo);
@@ -119,4 +123,8 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeXtensaTargetMC() {
119123
// Register the ELF target streamer.
120124
TargetRegistry::RegisterObjectTargetStreamer(
121125
getTheXtensaTarget(), createXtensaObjectTargetStreamer);
126+
127+
// Register the null target streamer.
128+
TargetRegistry::RegisterNullTargetStreamer(getTheXtensaTarget(),
129+
createXtensaNullTargetStreamer);
122130
}

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ class XtensaTargetStreamer : public MCTargetStreamer {
2424

2525
public:
2626
XtensaTargetStreamer(MCStreamer &S);
27-
virtual void emitLiteral(MCSymbol *LblSym, const MCExpr *Value, SMLoc L) = 0;
28-
virtual void emitLiteralLabel(MCSymbol *LblSym, SMLoc L) = 0;
29-
virtual void emitLiteral(const MCExpr *Value, SMLoc L) = 0;
30-
virtual void emitLiteral(std::string str) = 0;
27+
virtual void emitLiteral(MCSymbol *LblSym, const MCExpr *Value, SMLoc L) {};
28+
virtual void emitLiteralLabel(MCSymbol *LblSym, SMLoc L) {};
29+
virtual void emitLiteral(const MCExpr *Value, SMLoc L) {};
30+
virtual void emitLiteral(std::string str) {};
3131
void setLiteralSectionPrefix(StringRef Name) { LiteralSectionPrefix = Name; }
3232
StringRef getLiteralSectionPrefix() { return LiteralSectionPrefix; }
3333
};
@@ -37,9 +37,6 @@ class XtensaTargetAsmStreamer : public XtensaTargetStreamer {
3737

3838
public:
3939
XtensaTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
40-
void emitLiteral(MCSymbol *LblSym, const MCExpr *Value, SMLoc L) override {}
41-
void emitLiteralLabel(MCSymbol *LblSym, SMLoc L) override {}
42-
void emitLiteral(const MCExpr *Value, SMLoc L) override {}
4340
void emitLiteral(std::string str) override;
4441
};
4542

@@ -50,7 +47,6 @@ class XtensaTargetELFStreamer : public XtensaTargetStreamer {
5047
void emitLiteral(MCSymbol *LblSym, const MCExpr *Value, SMLoc L) override;
5148
void emitLiteralLabel(MCSymbol *LblSym, SMLoc L) override;
5249
void emitLiteral(const MCExpr *Value, SMLoc L) override;
53-
void emitLiteral(std::string str) override {}
5450
};
5551
} // end namespace llvm
5652

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
; Test the null streamer with a target streamer.
2+
; RUN: llc -O0 -filetype=null -mtriple=xtensa < %s
3+
4+
define i32 @main() {
5+
entry:
6+
ret i32 0
7+
}

0 commit comments

Comments
 (0)