| //===- ARCTargetMachine.cpp - Define TargetMachine for ARC ------*- C++ -*-===// | 
 | // | 
 | // 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 | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "ARCTargetMachine.h" | 
 | #include "ARC.h" | 
 | #include "ARCTargetTransformInfo.h" | 
 | #include "TargetInfo/ARCTargetInfo.h" | 
 | #include "llvm/CodeGen/Passes.h" | 
 | #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" | 
 | #include "llvm/CodeGen/TargetPassConfig.h" | 
 | #include "llvm/Support/TargetRegistry.h" | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | static Reloc::Model getRelocModel(Optional<Reloc::Model> RM) { | 
 |   if (!RM.hasValue()) | 
 |     return Reloc::Static; | 
 |   return *RM; | 
 | } | 
 |  | 
 | /// ARCTargetMachine ctor - Create an ILP32 architecture model | 
 | ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT, | 
 |                                    StringRef CPU, StringRef FS, | 
 |                                    const TargetOptions &Options, | 
 |                                    Optional<Reloc::Model> RM, | 
 |                                    Optional<CodeModel::Model> CM, | 
 |                                    CodeGenOpt::Level OL, bool JIT) | 
 |     : LLVMTargetMachine(T, | 
 |                         "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" | 
 |                         "f32:32:32-i64:32-f64:32-a:0:32-n32", | 
 |                         TT, CPU, FS, Options, getRelocModel(RM), | 
 |                         getEffectiveCodeModel(CM, CodeModel::Small), OL), | 
 |       TLOF(make_unique<TargetLoweringObjectFileELF>()), | 
 |       Subtarget(TT, CPU, FS, *this) { | 
 |   initAsmInfo(); | 
 | } | 
 |  | 
 | ARCTargetMachine::~ARCTargetMachine() = default; | 
 |  | 
 | namespace { | 
 |  | 
 | /// ARC Code Generator Pass Configuration Options. | 
 | class ARCPassConfig : public TargetPassConfig { | 
 | public: | 
 |   ARCPassConfig(ARCTargetMachine &TM, PassManagerBase &PM) | 
 |       : TargetPassConfig(TM, PM) {} | 
 |  | 
 |   ARCTargetMachine &getARCTargetMachine() const { | 
 |     return getTM<ARCTargetMachine>(); | 
 |   } | 
 |  | 
 |   bool addInstSelector() override; | 
 |   void addPreEmitPass() override; | 
 |   void addPreRegAlloc() override; | 
 | }; | 
 |  | 
 | } // end anonymous namespace | 
 |  | 
 | TargetPassConfig *ARCTargetMachine::createPassConfig(PassManagerBase &PM) { | 
 |   return new ARCPassConfig(*this, PM); | 
 | } | 
 |  | 
 | bool ARCPassConfig::addInstSelector() { | 
 |   addPass(createARCISelDag(getARCTargetMachine(), getOptLevel())); | 
 |   return false; | 
 | } | 
 |  | 
 | void ARCPassConfig::addPreEmitPass() { addPass(createARCBranchFinalizePass()); } | 
 |  | 
 | void ARCPassConfig::addPreRegAlloc() { | 
 |     addPass(createARCExpandPseudosPass()); | 
 |     addPass(createARCOptAddrMode()); | 
 | } | 
 |  | 
 | // Force static initialization. | 
 | extern "C" void LLVMInitializeARCTarget() { | 
 |   RegisterTargetMachine<ARCTargetMachine> X(getTheARCTarget()); | 
 | } | 
 |  | 
 | TargetTransformInfo | 
 | ARCTargetMachine::getTargetTransformInfo(const Function &F) { | 
 |   return TargetTransformInfo(ARCTTIImpl(this, F)); | 
 | } |