[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
+}