brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 8e19440 Raw
106 lines · cpp
1//===- ARCTargetMachine.cpp - Define TargetMachine for ARC ------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9//10//===----------------------------------------------------------------------===//11 12#include "ARCTargetMachine.h"13#include "ARC.h"14#include "ARCMachineFunctionInfo.h"15#include "ARCTargetTransformInfo.h"16#include "TargetInfo/ARCTargetInfo.h"17#include "llvm/CodeGen/Passes.h"18#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"19#include "llvm/CodeGen/TargetPassConfig.h"20#include "llvm/MC/TargetRegistry.h"21#include <optional>22 23using namespace llvm;24 25static Reloc::Model getRelocModel(std::optional<Reloc::Model> RM) {26  return RM.value_or(Reloc::Static);27}28 29/// ARCTargetMachine ctor - Create an ILP32 architecture model30ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT,31                                   StringRef CPU, StringRef FS,32                                   const TargetOptions &Options,33                                   std::optional<Reloc::Model> RM,34                                   std::optional<CodeModel::Model> CM,35                                   CodeGenOptLevel OL, bool JIT)36    : CodeGenTargetMachineImpl(T, TT.computeDataLayout(), TT, CPU, FS, Options,37                               getRelocModel(RM),38                               getEffectiveCodeModel(CM, CodeModel::Small), OL),39      TLOF(std::make_unique<TargetLoweringObjectFileELF>()),40      Subtarget(TT, std::string(CPU), std::string(FS), *this) {41  initAsmInfo();42}43 44ARCTargetMachine::~ARCTargetMachine() = default;45 46namespace {47 48/// ARC Code Generator Pass Configuration Options.49class ARCPassConfig : public TargetPassConfig {50public:51  ARCPassConfig(ARCTargetMachine &TM, PassManagerBase &PM)52      : TargetPassConfig(TM, PM) {}53 54  ARCTargetMachine &getARCTargetMachine() const {55    return getTM<ARCTargetMachine>();56  }57 58  void addIRPasses() override;59  bool addInstSelector() override;60  void addPreEmitPass() override;61  void addPreRegAlloc() override;62};63 64} // end anonymous namespace65 66TargetPassConfig *ARCTargetMachine::createPassConfig(PassManagerBase &PM) {67  return new ARCPassConfig(*this, PM);68}69 70void ARCPassConfig::addIRPasses() {71  addPass(createAtomicExpandLegacyPass());72 73  TargetPassConfig::addIRPasses();74}75 76bool ARCPassConfig::addInstSelector() {77  addPass(createARCISelDag(getARCTargetMachine(), getOptLevel()));78  return false;79}80 81void ARCPassConfig::addPreEmitPass() { addPass(createARCBranchFinalizePass()); }82 83void ARCPassConfig::addPreRegAlloc() {84    addPass(createARCExpandPseudosPass());85    addPass(createARCOptAddrMode());86}87 88MachineFunctionInfo *ARCTargetMachine::createMachineFunctionInfo(89    BumpPtrAllocator &Allocator, const Function &F,90    const TargetSubtargetInfo *STI) const {91    return ARCFunctionInfo::create<ARCFunctionInfo>(Allocator, F, STI);92}93 94// Force static initialization.95extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARCTarget() {96  RegisterTargetMachine<ARCTargetMachine> X(getTheARCTarget());97  PassRegistry &PR = *PassRegistry::getPassRegistry();98  initializeARCAsmPrinterPass(PR);99  initializeARCDAGToDAGISelLegacyPass(PR);100}101 102TargetTransformInfo103ARCTargetMachine::getTargetTransformInfo(const Function &F) const {104  return TargetTransformInfo(std::make_unique<ARCTTIImpl>(this, F));105}106