Home | History | Annotate | Download | only in ARC
      1 //===- ARCTargetMachine.cpp - Define TargetMachine for ARC ------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #include "ARCTargetMachine.h"
     14 #include "ARC.h"
     15 #include "ARCTargetTransformInfo.h"
     16 #include "llvm/CodeGen/Passes.h"
     17 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
     18 #include "llvm/CodeGen/TargetPassConfig.h"
     19 #include "llvm/Support/TargetRegistry.h"
     20 
     21 using namespace llvm;
     22 
     23 static Reloc::Model getRelocModel(Optional<Reloc::Model> RM) {
     24   if (!RM.hasValue())
     25     return Reloc::Static;
     26   return *RM;
     27 }
     28 
     29 static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
     30   if (CM)
     31     return *CM;
     32   return CodeModel::Small;
     33 }
     34 
     35 /// ARCTargetMachine ctor - Create an ILP32 architecture model
     36 ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT,
     37                                    StringRef CPU, StringRef FS,
     38                                    const TargetOptions &Options,
     39                                    Optional<Reloc::Model> RM,
     40                                    Optional<CodeModel::Model> CM,
     41                                    CodeGenOpt::Level OL, bool JIT)
     42     : LLVMTargetMachine(T,
     43                         "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
     44                         "f32:32:32-i64:32-f64:32-a:0:32-n32",
     45                         TT, CPU, FS, Options, getRelocModel(RM),
     46                         getEffectiveCodeModel(CM), OL),
     47       TLOF(make_unique<TargetLoweringObjectFileELF>()),
     48       Subtarget(TT, CPU, FS, *this) {
     49   initAsmInfo();
     50 }
     51 
     52 ARCTargetMachine::~ARCTargetMachine() = default;
     53 
     54 namespace {
     55 
     56 /// ARC Code Generator Pass Configuration Options.
     57 class ARCPassConfig : public TargetPassConfig {
     58 public:
     59   ARCPassConfig(ARCTargetMachine &TM, PassManagerBase &PM)
     60       : TargetPassConfig(TM, PM) {}
     61 
     62   ARCTargetMachine &getARCTargetMachine() const {
     63     return getTM<ARCTargetMachine>();
     64   }
     65 
     66   bool addInstSelector() override;
     67   void addPreEmitPass() override;
     68   void addPreRegAlloc() override;
     69 };
     70 
     71 } // end anonymous namespace
     72 
     73 TargetPassConfig *ARCTargetMachine::createPassConfig(PassManagerBase &PM) {
     74   return new ARCPassConfig(*this, PM);
     75 }
     76 
     77 bool ARCPassConfig::addInstSelector() {
     78   addPass(createARCISelDag(getARCTargetMachine(), getOptLevel()));
     79   return false;
     80 }
     81 
     82 void ARCPassConfig::addPreEmitPass() { addPass(createARCBranchFinalizePass()); }
     83 
     84 void ARCPassConfig::addPreRegAlloc() { addPass(createARCExpandPseudosPass()); }
     85 
     86 // Force static initialization.
     87 extern "C" void LLVMInitializeARCTarget() {
     88   RegisterTargetMachine<ARCTargetMachine> X(getTheARCTarget());
     89 }
     90 
     91 TargetTransformInfo
     92 ARCTargetMachine::getTargetTransformInfo(const Function &F) {
     93   return TargetTransformInfo(ARCTTIImpl(this, F));
     94 }
     95