Home | History | Annotate | Download | only in XCore
      1 //===-- XCoreTargetMachine.cpp - Define TargetMachine for XCore -----------===//
      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 "XCoreTargetMachine.h"
     14 #include "XCore.h"
     15 #include "llvm/CodeGen/Passes.h"
     16 #include "llvm/IR/Module.h"
     17 #include "llvm/PassManager.h"
     18 #include "llvm/Support/TargetRegistry.h"
     19 using namespace llvm;
     20 
     21 /// XCoreTargetMachine ctor - Create an ILP32 architecture model
     22 ///
     23 XCoreTargetMachine::XCoreTargetMachine(const Target &T, StringRef TT,
     24                                        StringRef CPU, StringRef FS,
     25                                        const TargetOptions &Options,
     26                                        Reloc::Model RM, CodeModel::Model CM,
     27                                        CodeGenOpt::Level OL)
     28     : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
     29       Subtarget(TT, CPU, FS, *this) {
     30   initAsmInfo();
     31 }
     32 
     33 namespace {
     34 /// XCore Code Generator Pass Configuration Options.
     35 class XCorePassConfig : public TargetPassConfig {
     36 public:
     37   XCorePassConfig(XCoreTargetMachine *TM, PassManagerBase &PM)
     38     : TargetPassConfig(TM, PM) {}
     39 
     40   XCoreTargetMachine &getXCoreTargetMachine() const {
     41     return getTM<XCoreTargetMachine>();
     42   }
     43 
     44   bool addPreISel() override;
     45   bool addInstSelector() override;
     46   bool addPreEmitPass() override;
     47 };
     48 } // namespace
     49 
     50 TargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) {
     51   return new XCorePassConfig(this, PM);
     52 }
     53 
     54 bool XCorePassConfig::addPreISel() {
     55   addPass(createXCoreLowerThreadLocalPass());
     56   return false;
     57 }
     58 
     59 bool XCorePassConfig::addInstSelector() {
     60   addPass(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel()));
     61   return false;
     62 }
     63 
     64 bool XCorePassConfig::addPreEmitPass() {
     65   addPass(createXCoreFrameToArgsOffsetEliminationPass());
     66   return false;
     67 }
     68 
     69 // Force static initialization.
     70 extern "C" void LLVMInitializeXCoreTarget() {
     71   RegisterTargetMachine<XCoreTargetMachine> X(TheXCoreTarget);
     72 }
     73 
     74 void XCoreTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
     75   // Add first the target-independent BasicTTI pass, then our XCore pass. This
     76   // allows the XCore pass to delegate to the target independent layer when
     77   // appropriate.
     78   PM.add(createBasicTargetTransformInfoPass(this));
     79   PM.add(createXCoreTargetTransformInfoPass(this));
     80 }
     81