[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