diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 | 
| commit | 145449b1e420787bb99721a429341fa6be3adfb6 (patch) | |
| tree | 1d56ae694a6de602e348dd80165cf881a36600ed /llvm/lib/CodeGen/LLVMTargetMachine.cpp | |
| parent | ecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (diff) | |
Diffstat (limited to 'llvm/lib/CodeGen/LLVMTargetMachine.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/LLVMTargetMachine.cpp | 38 | 
1 files changed, 26 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/llvm/lib/CodeGen/LLVMTargetMachine.cpp index 0d3685d4141c..3192dcadb5f5 100644 --- a/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ b/llvm/lib/CodeGen/LLVMTargetMachine.cpp @@ -23,20 +23,19 @@  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCInstrInfo.h"  #include "llvm/MC/MCObjectWriter.h" +#include "llvm/MC/MCRegisterInfo.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSubtargetInfo.h"  #include "llvm/MC/TargetRegistry.h"  #include "llvm/Support/CommandLine.h" -#include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/FormattedStream.h" -#include "llvm/Target/TargetLoweringObjectFile.h"  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetOptions.h"  using namespace llvm; -static cl::opt<bool> EnableTrapUnreachable("trap-unreachable", -  cl::Hidden, cl::ZeroOrMore, cl::init(false), -  cl::desc("Enable generating trap for unreachable")); +static cl::opt<bool> +    EnableTrapUnreachable("trap-unreachable", cl::Hidden, +                          cl::desc("Enable generating trap for unreachable"));  void LLVMTargetMachine::initAsmInfo() {    MRI.reset(TheTarget.createMCRegInfo(getTargetTriple().str())); @@ -99,7 +98,7 @@ LLVMTargetMachine::LLVMTargetMachine(const Target &T,  }  TargetTransformInfo -LLVMTargetMachine::getTargetTransformInfo(const Function &F) { +LLVMTargetMachine::getTargetTransformInfo(const Function &F) const {    return TargetTransformInfo(BasicTTIImpl(this, F));  } @@ -164,22 +163,35 @@ Expected<std::unique_ptr<MCStreamer>> LLVMTargetMachine::createMCStreamer(      // Create a code emitter if asked to show the encoding.      std::unique_ptr<MCCodeEmitter> MCE;      if (Options.MCOptions.ShowMCEncoding) -      MCE.reset(getTarget().createMCCodeEmitter(MII, MRI, Context)); +      MCE.reset(getTarget().createMCCodeEmitter(MII, Context)); + +    bool UseDwarfDirectory = false; +    switch (Options.MCOptions.MCUseDwarfDirectory) { +    case MCTargetOptions::DisableDwarfDirectory: +      UseDwarfDirectory = false; +      break; +    case MCTargetOptions::EnableDwarfDirectory: +      UseDwarfDirectory = true; +      break; +    case MCTargetOptions::DefaultDwarfDirectory: +      UseDwarfDirectory = MAI.enableDwarfFileDirectoryDefault(); +      break; +    }      std::unique_ptr<MCAsmBackend> MAB(          getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions));      auto FOut = std::make_unique<formatted_raw_ostream>(Out);      MCStreamer *S = getTarget().createAsmStreamer(          Context, std::move(FOut), Options.MCOptions.AsmVerbose, -        Options.MCOptions.MCUseDwarfDirectory, InstPrinter, std::move(MCE), -        std::move(MAB), Options.MCOptions.ShowMCInst); +        UseDwarfDirectory, InstPrinter, std::move(MCE), std::move(MAB), +        Options.MCOptions.ShowMCInst);      AsmStreamer.reset(S);      break;    }    case CGFT_ObjectFile: {      // Create the code emitter for the target if it exists.  If not, .o file      // emission fails. -    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, Context); +    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, Context);      if (!MCE)        return make_error<StringError>("createMCCodeEmitter failed",                                       inconvertibleErrorCode()); @@ -252,6 +264,9 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,           "Cannot emit MC with limited codegen pipeline");    Ctx = &MMIWP->getMMI().getContext(); +  // libunwind is unable to load compact unwind dynamically, so we must generate +  // DWARF unwind info for the JIT. +  Options.MCOptions.EmitDwarfUnwind = EmitDwarfUnwindType::Always;    if (Options.MCOptions.MCSaveTempLabels)      Ctx->setAllowTemporaryLabels(false); @@ -259,8 +274,7 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,    // emission fails.    const MCSubtargetInfo &STI = *getMCSubtargetInfo();    const MCRegisterInfo &MRI = *getMCRegisterInfo(); -  MCCodeEmitter *MCE = -      getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx); +  MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getMCInstrInfo(), *Ctx);    MCAsmBackend *MAB =        getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions);    if (!MCE || !MAB)  | 
