[llvm] [Xtensa] Implement XtensaNullTargetStreamer (PR #203819)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 14 21:29:43 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-xtensa
Author: Alexey Gerenkov (gerekon)
<details>
<summary>Changes</summary>
It fixes crash in Xtensa AsmParser::run() during ModuleSummaryIndexAnalysis pass.
---
Full diff: https://github.com/llvm/llvm-project/pull/203819.diff
4 Files Affected:
- (modified) llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp (+2)
- (modified) llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp (+8)
- (modified) llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h (+3-4)
- (added) llvm/test/CodeGen/Xtensa/null-streamer.ll (+7)
``````````diff
diff --git a/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp b/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp
index dc33295c16f28..df2f625cf942a 100644
--- a/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp
+++ b/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp
@@ -41,6 +41,8 @@ class XtensaAsmParser : public MCTargetAsmParser {
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 8ccf8c83c0921..265b9e1ca84db 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp
@@ -274,6 +274,10 @@ createXtensaObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
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(),
@@ -310,4 +314,8 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeXtensaTargetMC() {
// 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 817940e880b3c..f8aa951b3e9d3 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaTargetStreamer.h
@@ -24,13 +24,13 @@ class XtensaTargetStreamer : public MCTargetStreamer {
// 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 @@ class XtensaTargetELFStreamer : public XtensaTargetStreamer {
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 0000000000000..65ff6d21709a3
--- /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
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/203819
More information about the llvm-commits
mailing list