[NFC][DirectX backend] Fix crash when emit_obj for DirectX backend.
authorXiang Li <python3kgae@outlook.com>
Sun, 31 Jul 2022 21:15:28 +0000 (14:15 -0700)
committerXiang Li <python3kgae@outlook.com>
Tue, 2 Aug 2022 19:09:07 +0000 (12:09 -0700)
When emit-obj from clang directly, DirectX backend will hit assert caused by not initialize passes for AsmPrinter.
The fix will initialize the passes by calling createPassConfig.
Also ignore global variable which not has section in DXILAsmPrinter::emitGlobalVariable to avoid hit llvm_unreachable in DXILTargetObjectFile::SelectSectionForGlobal.

Reviewed By: beanz

Differential Revision: https://reviews.llvm.org/D130856

llvm/lib/Target/DirectX/DirectXAsmPrinter.cpp
llvm/lib/Target/DirectX/DirectXTargetMachine.cpp

index cea3283..ad1f6b3 100644 (file)
@@ -46,6 +46,8 @@ void DXILAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
   // Skip the LLVM metadata
   if (GV->getSection() == "llvm.metadata")
     return;
+  if (!GV->hasSection())
+    return;
   SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
   MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
   OutStreamer->switchSection(TheSection);
index 44bef80..8ea074c 100644 (file)
@@ -67,6 +67,11 @@ public:
   }
 
   FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
+  void addCodeGenPrepare() override {
+    addPass(createDXILOpLoweringLegacyPass());
+    addPass(createDXILPrepareModulePass());
+    addPass(createDXILTranslateMetadataPass());
+  }
 };
 
 DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT,
@@ -91,9 +96,9 @@ bool DirectXTargetMachine::addPassesToEmitFile(
     PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
     CodeGenFileType FileType, bool DisableVerify,
     MachineModuleInfoWrapperPass *MMIWP) {
-  PM.add(createDXILOpLoweringLegacyPass());
-  PM.add(createDXILPrepareModulePass());
-  PM.add(createDXILTranslateMetadataPass());
+  TargetPassConfig *PassConfig = createPassConfig(PM);
+  PassConfig->addCodeGenPrepare();
+
   if (TargetPassConfig::willCompleteCodeGenPipeline()) {
     PM.add(createDXILEmbedderPass());
   }