From fac87b3dd7f4e27cd4d5dcdddf0d9ade4a9a2ac4 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Thu, 26 Jul 2018 13:16:06 +0000 Subject: [PATCH] dwarfgen: Don't create an AsmPrinter with an invalid ObjFile lowering The AsmPrinter created in the tests contained an uninitialized TargetLoweringObjectFile. Things mostly worked regardless, because we used a separate instance of that class to specify sections to emit. This rearanges the object construction order so that we can avoid creating two lowering objects. Instead, we properly initialize the object in the AsmPrinter, and have the DWARF generator store a pointer to it. llvm-svn: 338026 --- llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp | 30 ++++++++++++----------- llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h | 4 +-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp index b93b0cc..4f4a737 100644 --- a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp @@ -30,6 +30,7 @@ #include "llvm/PassAnalysisSupport.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" @@ -372,10 +373,6 @@ llvm::Error dwarfgen::Generator::init(Triple TheTriple, uint16_t V) { return make_error("no asm info for target " + TripleName, inconvertibleErrorCode()); - MOFI.reset(new MCObjectFileInfo); - MC.reset(new MCContext(MAI.get(), MRI.get(), MOFI.get())); - MOFI->InitMCObjectFileInfo(TheTriple, /*PIC*/ false, *MC); - MSTI.reset(TheTarget->createMCSubtargetInfo(TripleName, "", "")); if (!MSTI) return make_error("no subtarget info for target " + TripleName, @@ -393,6 +390,16 @@ llvm::Error dwarfgen::Generator::init(Triple TheTriple, uint16_t V) { TripleName, inconvertibleErrorCode()); + TM.reset(TheTarget->createTargetMachine(TripleName, "", "", TargetOptions(), + None)); + if (!TM) + return make_error("no target machine for target " + TripleName, + inconvertibleErrorCode()); + + TLOF = TM->getObjFileLowering(); + MC.reset(new MCContext(MAI.get(), MRI.get(), TLOF)); + TLOF->Initialize(*MC, *TM); + MCE = TheTarget->createMCCodeEmitter(*MII, *MRI, *MC); if (!MCE) return make_error("no code emitter for target " + TripleName, @@ -410,13 +417,8 @@ llvm::Error dwarfgen::Generator::init(Triple TheTriple, uint16_t V) { TripleName, inconvertibleErrorCode()); - // Finally create the AsmPrinter we'll use to emit the DIEs. - TM.reset(TheTarget->createTargetMachine(TripleName, "", "", TargetOptions(), - None)); - if (!TM) - return make_error("no target machine for target " + TripleName, - inconvertibleErrorCode()); + // Finally create the AsmPrinter we'll use to emit the DIEs. Asm.reset(TheTarget->createAsmPrinter(*TM, std::unique_ptr(MS))); if (!Asm) return make_error("no asm printer for target " + TripleName, @@ -447,9 +449,9 @@ StringRef dwarfgen::Generator::generate() { SecOffset += CUOffset; CU->setLength(CUOffset - 4); } - Abbreviations.Emit(Asm.get(), MOFI->getDwarfAbbrevSection()); - StringPool->emit(*Asm, MOFI->getDwarfStrSection()); - MS->SwitchSection(MOFI->getDwarfInfoSection()); + Abbreviations.Emit(Asm.get(), TLOF->getDwarfAbbrevSection()); + StringPool->emit(*Asm, TLOF->getDwarfStrSection()); + MS->SwitchSection(TLOF->getDwarfInfoSection()); for (auto &CU : CompileUnits) { uint16_t Version = CU->getVersion(); auto Length = CU->getLength(); @@ -468,7 +470,7 @@ StringRef dwarfgen::Generator::generate() { Asm->emitDwarfDIE(*CU->getUnitDIE().Die); } - MS->SwitchSection(MOFI->getDwarfLineSection()); + MS->SwitchSection(TLOF->getDwarfLineSection()); for (auto < : LineTables) LT->generate(*MC, *Asm); diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h index 6d41cb5..72cb069 100644 --- a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h +++ b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h @@ -36,11 +36,11 @@ class MCCodeEmitter; class MCContext; struct MCDwarfLineTableParams; class MCInstrInfo; -class MCObjectFileInfo; class MCRegisterInfo; class MCStreamer; class MCSubtargetInfo; class raw_fd_ostream; +class TargetLoweringObjectFile; class TargetMachine; class Triple; @@ -227,7 +227,6 @@ private: class Generator { std::unique_ptr MRI; std::unique_ptr MAI; - std::unique_ptr MOFI; std::unique_ptr MC; MCAsmBackend *MAB; // Owned by MCStreamer std::unique_ptr MII; @@ -235,6 +234,7 @@ class Generator { MCCodeEmitter *MCE; // Owned by MCStreamer MCStreamer *MS; // Owned by AsmPrinter std::unique_ptr TM; + TargetLoweringObjectFile *TLOF; // Owned by TargetMachine; std::unique_ptr Asm; BumpPtrAllocator Allocator; std::unique_ptr StringPool; // Entries owned by Allocator. -- 2.7.4