diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-12-20 19:53:05 +0000 |
| commit | 0b57cec536236d46e3dba9bd041533462f33dbb7 (patch) | |
| tree | 56229dbdbbf76d18580f72f789003db17246c8d9 /contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp | |
| parent | 718ef55ec7785aae63f98f8ca05dc07ed399c16d (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp | 270 |
1 files changed, 0 insertions, 270 deletions
diff --git a/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp deleted file mode 100644 index 886ae7e94adb..000000000000 --- a/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ /dev/null @@ -1,270 +0,0 @@ -//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements the LLVMTargetMachine class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Analysis/Passes.h" -#include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/BasicTTIImpl.h" -#include "llvm/CodeGen/MachineModuleInfo.h" -#include "llvm/CodeGen/Passes.h" -#include "llvm/CodeGen/TargetPassConfig.h" -#include "llvm/IR/LegacyPassManager.h" -#include "llvm/MC/MCAsmBackend.h" -#include "llvm/MC/MCAsmInfo.h" -#include "llvm/MC/MCCodeEmitter.h" -#include "llvm/MC/MCContext.h" -#include "llvm/MC/MCInstrInfo.h" -#include "llvm/MC/MCObjectWriter.h" -#include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/FormattedStream.h" -#include "llvm/Support/TargetRegistry.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")); - -void LLVMTargetMachine::initAsmInfo() { - MRI.reset(TheTarget.createMCRegInfo(getTargetTriple().str())); - MII.reset(TheTarget.createMCInstrInfo()); - // FIXME: Having an MCSubtargetInfo on the target machine is a hack due - // to some backends having subtarget feature dependent module level - // code generation. This is similar to the hack in the AsmPrinter for - // module level assembly etc. - STI.reset(TheTarget.createMCSubtargetInfo( - getTargetTriple().str(), getTargetCPU(), getTargetFeatureString())); - - MCAsmInfo *TmpAsmInfo = - TheTarget.createMCAsmInfo(*MRI, getTargetTriple().str()); - // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0, - // and if the old one gets included then MCAsmInfo will be NULL and - // we'll crash later. - // Provide the user with a useful error message about what's wrong. - assert(TmpAsmInfo && "MCAsmInfo not initialized. " - "Make sure you include the correct TargetSelect.h" - "and that InitializeAllTargetMCs() is being invoked!"); - - if (Options.DisableIntegratedAS) - TmpAsmInfo->setUseIntegratedAssembler(false); - - TmpAsmInfo->setPreserveAsmComments(Options.MCOptions.PreserveAsmComments); - - TmpAsmInfo->setCompressDebugSections(Options.CompressDebugSections); - - TmpAsmInfo->setRelaxELFRelocations(Options.RelaxELFRelocations); - - if (Options.ExceptionModel != ExceptionHandling::None) - TmpAsmInfo->setExceptionsType(Options.ExceptionModel); - - AsmInfo.reset(TmpAsmInfo); -} - -LLVMTargetMachine::LLVMTargetMachine(const Target &T, - StringRef DataLayoutString, - const Triple &TT, StringRef CPU, - StringRef FS, const TargetOptions &Options, - Reloc::Model RM, CodeModel::Model CM, - CodeGenOpt::Level OL) - : TargetMachine(T, DataLayoutString, TT, CPU, FS, Options) { - this->RM = RM; - this->CMModel = CM; - this->OptLevel = OL; - - if (EnableTrapUnreachable) - this->Options.TrapUnreachable = true; -} - -TargetTransformInfo -LLVMTargetMachine::getTargetTransformInfo(const Function &F) { - return TargetTransformInfo(BasicTTIImpl(this, F)); -} - -/// addPassesToX helper drives creation and initialization of TargetPassConfig. -static TargetPassConfig * -addPassesToGenerateCode(LLVMTargetMachine &TM, PassManagerBase &PM, - bool DisableVerify, MachineModuleInfo &MMI) { - // Targets may override createPassConfig to provide a target-specific - // subclass. - TargetPassConfig *PassConfig = TM.createPassConfig(PM); - // Set PassConfig options provided by TargetMachine. - PassConfig->setDisableVerify(DisableVerify); - PM.add(PassConfig); - PM.add(&MMI); - - if (PassConfig->addISelPasses()) - return nullptr; - PassConfig->addMachinePasses(); - PassConfig->setInitialized(); - return PassConfig; -} - -bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM, - raw_pwrite_stream &Out, - raw_pwrite_stream *DwoOut, - CodeGenFileType FileType, - MCContext &Context) { - if (Options.MCOptions.MCSaveTempLabels) - Context.setAllowTemporaryLabels(false); - - const MCSubtargetInfo &STI = *getMCSubtargetInfo(); - const MCAsmInfo &MAI = *getMCAsmInfo(); - const MCRegisterInfo &MRI = *getMCRegisterInfo(); - const MCInstrInfo &MII = *getMCInstrInfo(); - - std::unique_ptr<MCStreamer> AsmStreamer; - - switch (FileType) { - case CGFT_AssemblyFile: { - MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter( - getTargetTriple(), MAI.getAssemblerDialect(), MAI, MII, MRI); - - // 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)); - - std::unique_ptr<MCAsmBackend> MAB( - getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions)); - auto FOut = llvm::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); - 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); - MCAsmBackend *MAB = - getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions); - if (!MCE || !MAB) - return true; - - // Don't waste memory on names of temp labels. - Context.setUseNamesOnTempLabels(false); - - Triple T(getTargetTriple().str()); - AsmStreamer.reset(getTarget().createMCObjectStreamer( - T, Context, std::unique_ptr<MCAsmBackend>(MAB), - DwoOut ? MAB->createDwoObjectWriter(Out, *DwoOut) - : MAB->createObjectWriter(Out), - std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll, - Options.MCOptions.MCIncrementalLinkerCompatible, - /*DWARFMustBeAtTheEnd*/ true)); - break; - } - case CGFT_Null: - // The Null output is intended for use for performance analysis and testing, - // not real users. - AsmStreamer.reset(getTarget().createNullStreamer(Context)); - break; - } - - // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. - FunctionPass *Printer = - getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); - if (!Printer) - return true; - - PM.add(Printer); - return false; -} - -bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, - raw_pwrite_stream &Out, - raw_pwrite_stream *DwoOut, - CodeGenFileType FileType, - bool DisableVerify, - MachineModuleInfo *MMI) { - // Add common CodeGen passes. - if (!MMI) - MMI = new MachineModuleInfo(this); - TargetPassConfig *PassConfig = - addPassesToGenerateCode(*this, PM, DisableVerify, *MMI); - if (!PassConfig) - return true; - - if (!TargetPassConfig::willCompleteCodeGenPipeline()) { - if (this->getTargetTriple().isOSAIX()) { - // On AIX, we might manifest MCSymbols during SDAG lowering. For MIR - // testing to be meaningful, we need to ensure that the symbols created - // are MCSymbolXCOFF variants, which requires that - // the TargetLoweringObjectFile instance has been initialized. - MCContext &Ctx = MMI->getContext(); - const_cast<TargetLoweringObjectFile &>(*this->getObjFileLowering()) - .Initialize(Ctx, *this); - } - PM.add(createPrintMIRPass(Out)); - } else if (addAsmPrinter(PM, Out, DwoOut, FileType, MMI->getContext())) - return true; - - PM.add(createFreeMachineFunctionPass()); - return false; -} - -/// addPassesToEmitMC - Add passes to the specified pass manager to get -/// machine code emitted with the MCJIT. This method returns true if machine -/// code is not supported. It fills the MCContext Ctx pointer which can be -/// used to build custom MCStreamer. -/// -bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, - raw_pwrite_stream &Out, - bool DisableVerify) { - // Add common CodeGen passes. - MachineModuleInfo *MMI = new MachineModuleInfo(this); - TargetPassConfig *PassConfig = - addPassesToGenerateCode(*this, PM, DisableVerify, *MMI); - if (!PassConfig) - return true; - assert(TargetPassConfig::willCompleteCodeGenPipeline() && - "Cannot emit MC with limited codegen pipeline"); - - Ctx = &MMI->getContext(); - if (Options.MCOptions.MCSaveTempLabels) - Ctx->setAllowTemporaryLabels(false); - - // Create the code emitter for the target if it exists. If not, .o file - // emission fails. - const MCSubtargetInfo &STI = *getMCSubtargetInfo(); - const MCRegisterInfo &MRI = *getMCRegisterInfo(); - MCCodeEmitter *MCE = - getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx); - MCAsmBackend *MAB = - getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions); - if (!MCE || !MAB) - return true; - - const Triple &T = getTargetTriple(); - std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer( - T, *Ctx, std::unique_ptr<MCAsmBackend>(MAB), MAB->createObjectWriter(Out), - std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll, - Options.MCOptions.MCIncrementalLinkerCompatible, - /*DWARFMustBeAtTheEnd*/ true)); - - // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. - FunctionPass *Printer = - getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); - if (!Printer) - return true; - - PM.add(Printer); - PM.add(createFreeMachineFunctionPass()); - - return false; // success! -} |
