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