Path: blob/main/contrib/llvm-project/llvm/lib/Target/ARC/ARCTargetMachine.cpp
35266 views
//===- ARCTargetMachine.cpp - Define TargetMachine for ARC ------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8//9//===----------------------------------------------------------------------===//1011#include "ARCTargetMachine.h"12#include "ARC.h"13#include "ARCMachineFunctionInfo.h"14#include "ARCTargetTransformInfo.h"15#include "TargetInfo/ARCTargetInfo.h"16#include "llvm/CodeGen/Passes.h"17#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"18#include "llvm/CodeGen/TargetPassConfig.h"19#include "llvm/MC/TargetRegistry.h"20#include <optional>2122using namespace llvm;2324static Reloc::Model getRelocModel(std::optional<Reloc::Model> RM) {25return RM.value_or(Reloc::Static);26}2728/// ARCTargetMachine ctor - Create an ILP32 architecture model29ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT,30StringRef CPU, StringRef FS,31const TargetOptions &Options,32std::optional<Reloc::Model> RM,33std::optional<CodeModel::Model> CM,34CodeGenOptLevel OL, bool JIT)35: LLVMTargetMachine(T,36"e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"37"f32:32:32-i64:32-f64:32-a:0:32-n32",38TT, CPU, FS, Options, getRelocModel(RM),39getEffectiveCodeModel(CM, CodeModel::Small), OL),40TLOF(std::make_unique<TargetLoweringObjectFileELF>()),41Subtarget(TT, std::string(CPU), std::string(FS), *this) {42initAsmInfo();43}4445ARCTargetMachine::~ARCTargetMachine() = default;4647namespace {4849/// ARC Code Generator Pass Configuration Options.50class ARCPassConfig : public TargetPassConfig {51public:52ARCPassConfig(ARCTargetMachine &TM, PassManagerBase &PM)53: TargetPassConfig(TM, PM) {}5455ARCTargetMachine &getARCTargetMachine() const {56return getTM<ARCTargetMachine>();57}5859void addIRPasses() override;60bool addInstSelector() override;61void addPreEmitPass() override;62void addPreRegAlloc() override;63};6465} // end anonymous namespace6667TargetPassConfig *ARCTargetMachine::createPassConfig(PassManagerBase &PM) {68return new ARCPassConfig(*this, PM);69}7071void ARCPassConfig::addIRPasses() {72addPass(createAtomicExpandLegacyPass());7374TargetPassConfig::addIRPasses();75}7677bool ARCPassConfig::addInstSelector() {78addPass(createARCISelDag(getARCTargetMachine(), getOptLevel()));79return false;80}8182void ARCPassConfig::addPreEmitPass() { addPass(createARCBranchFinalizePass()); }8384void ARCPassConfig::addPreRegAlloc() {85addPass(createARCExpandPseudosPass());86addPass(createARCOptAddrMode());87}8889MachineFunctionInfo *ARCTargetMachine::createMachineFunctionInfo(90BumpPtrAllocator &Allocator, const Function &F,91const TargetSubtargetInfo *STI) const {92return ARCFunctionInfo::create<ARCFunctionInfo>(Allocator, F, STI);93}9495// Force static initialization.96extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARCTarget() {97RegisterTargetMachine<ARCTargetMachine> X(getTheARCTarget());98PassRegistry &PR = *PassRegistry::getPassRegistry();99initializeARCDAGToDAGISelLegacyPass(PR);100}101102TargetTransformInfo103ARCTargetMachine::getTargetTransformInfo(const Function &F) const {104return TargetTransformInfo(ARCTTIImpl(this, F));105}106107108