[Xtensa] Implement XtensaNullTargetStreamer (#203819)
It fixes crash in Xtensa AsmParser::run() during
ModuleSummaryIndexAnalysis pass.
diff --git a/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp b/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp
index 5ea0f35..1a624fd 100644
--- a/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp
+++ b/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp
@@ -41,6 +41,8 @@
SMLoc getLoc() const { return getParser().getTok().getLoc(); }
XtensaTargetStreamer &getTargetStreamer() {
+ assert(getParser().getStreamer().getTargetStreamer() &&
+ "do not have a target streamer");
MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
return static_cast<XtensaTargetStreamer &>(TS);
}
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp
index cb8c3ac..397b56f 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp
@@ -279,6 +279,10 @@
return new XtensaTargetELFStreamer(S);
}
+static MCTargetStreamer *createXtensaNullTargetStreamer(MCStreamer &S) {
+ return new XtensaTargetStreamer(S);
+}
+
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeXtensaTargetMC() {
// Register the MCAsmInfo.
TargetRegistry::RegisterMCAsmInfo(getTheXtensaTarget(),
@@ -315,4 +319,8 @@
// Register the ELF target streamer.
TargetRegistry::RegisterObjectTargetStreamer(
getTheXtensaTarget(), createXtensaObjectTargetStreamer);
+
+ // Register the null target streamer.
+ TargetRegistry::RegisterNullTargetStreamer(getTheXtensaTarget(),
+ createXtensaNullTargetStreamer);
}
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h
index 817940e..f8aa951 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h
@@ -24,13 +24,13 @@
// section is not switched yet (SwitchLiteralSection is true) then switch to
// literal section.
virtual void emitLiteral(MCSymbol *LblSym, const MCExpr *Value,
- bool SwitchLiteralSection, SMLoc L = SMLoc()) = 0;
+ bool SwitchLiteralSection, SMLoc L = SMLoc()) {};
- virtual void emitLiteralPosition() = 0;
+ virtual void emitLiteralPosition() {};
// Switch to the literal section. The BaseSection name is used to construct
// literal section name.
- virtual void startLiteralSection(MCSection *BaseSection) = 0;
+ virtual void startLiteralSection(MCSection *BaseSection) {};
};
class XtensaTargetAsmStreamer : public XtensaTargetStreamer {
@@ -50,7 +50,6 @@
MCELFStreamer &getStreamer();
void emitLiteral(MCSymbol *LblSym, const MCExpr *Value,
bool SwitchLiteralSection, SMLoc L) override;
- void emitLiteralPosition() override {}
void startLiteralSection(MCSection *Section) override;
};
} // end namespace llvm
diff --git a/llvm/test/CodeGen/Xtensa/null-streamer.ll b/llvm/test/CodeGen/Xtensa/null-streamer.ll
new file mode 100644
index 0000000..65ff6d2
--- /dev/null
+++ b/llvm/test/CodeGen/Xtensa/null-streamer.ll
@@ -0,0 +1,7 @@
+; Test the null streamer with a target streamer.
+; RUN: llc -O0 -filetype=null -mtriple=xtensa < %s
+
+define i32 @main() {
+entry:
+ ret i32 0
+}