AArch64TargetMachine.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1//===-- AArch64TargetMachine.cpp - Define TargetMachine for AArch64 -------===// 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// This file contains the implementation of the AArch64TargetMachine 11// methods. Principally just setting up the passes needed to generate correct 12// code on this architecture. 13// 14//===----------------------------------------------------------------------===// 15 16#include "AArch64.h" 17#include "AArch64TargetMachine.h" 18#include "MCTargetDesc/AArch64MCTargetDesc.h" 19#include "llvm/CodeGen/Passes.h" 20#include "llvm/PassManager.h" 21#include "llvm/Support/TargetRegistry.h" 22 23using namespace llvm; 24 25extern "C" void LLVMInitializeAArch64Target() { 26 RegisterTargetMachine<AArch64leTargetMachine> X(TheAArch64leTarget); 27 RegisterTargetMachine<AArch64beTargetMachine> Y(TheAArch64beTarget); 28} 29 30AArch64TargetMachine::AArch64TargetMachine(const Target &T, StringRef TT, 31 StringRef CPU, StringRef FS, 32 const TargetOptions &Options, 33 Reloc::Model RM, CodeModel::Model CM, 34 CodeGenOpt::Level OL, 35 bool LittleEndian) 36 : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 37 Subtarget(TT, CPU, FS, LittleEndian), 38 InstrInfo(Subtarget), 39 DL(LittleEndian ? 40 "e-m:e-i64:64-i128:128-n32:64-S128" : 41 "E-m:e-i64:64-i128:128-n32:64-S128"), 42 TLInfo(*this), 43 TSInfo(*this), 44 FrameLowering(Subtarget) { 45 initAsmInfo(); 46} 47 48void AArch64leTargetMachine::anchor() { } 49 50AArch64leTargetMachine:: 51AArch64leTargetMachine(const Target &T, StringRef TT, 52 StringRef CPU, StringRef FS, const TargetOptions &Options, 53 Reloc::Model RM, CodeModel::Model CM, 54 CodeGenOpt::Level OL) 55 : AArch64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {} 56 57void AArch64beTargetMachine::anchor() { } 58 59AArch64beTargetMachine:: 60AArch64beTargetMachine(const Target &T, StringRef TT, 61 StringRef CPU, StringRef FS, const TargetOptions &Options, 62 Reloc::Model RM, CodeModel::Model CM, 63 CodeGenOpt::Level OL) 64 : AArch64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {} 65 66void AArch64TargetMachine::addAnalysisPasses(PassManagerBase &PM) { 67 // Add first the target-independent BasicTTI pass, then our AArch64 pass. This 68 // allows the AArch64 pass to delegate to the target independent layer when 69 // appropriate. 70 PM.add(createBasicTargetTransformInfoPass(this)); 71 PM.add(createAArch64TargetTransformInfoPass(this)); 72} 73 74namespace { 75/// AArch64 Code Generator Pass Configuration Options. 76class AArch64PassConfig : public TargetPassConfig { 77public: 78 AArch64PassConfig(AArch64TargetMachine *TM, PassManagerBase &PM) 79 : TargetPassConfig(TM, PM) {} 80 81 AArch64TargetMachine &getAArch64TargetMachine() const { 82 return getTM<AArch64TargetMachine>(); 83 } 84 85 const AArch64Subtarget &getAArch64Subtarget() const { 86 return *getAArch64TargetMachine().getSubtargetImpl(); 87 } 88 89 virtual bool addInstSelector(); 90 virtual bool addPreEmitPass(); 91}; 92} // namespace 93 94TargetPassConfig *AArch64TargetMachine::createPassConfig(PassManagerBase &PM) { 95 return new AArch64PassConfig(this, PM); 96} 97 98bool AArch64PassConfig::addPreEmitPass() { 99 addPass(&UnpackMachineBundlesID); 100 addPass(createAArch64BranchFixupPass()); 101 return true; 102} 103 104bool AArch64PassConfig::addInstSelector() { 105 addPass(createAArch64ISelDAG(getAArch64TargetMachine(), getOptLevel())); 106 107 // For ELF, cleanup any local-dynamic TLS accesses. 108 if (getAArch64Subtarget().isTargetELF() && getOptLevel() != CodeGenOpt::None) 109 addPass(createAArch64CleanupLocalDynamicTLSPass()); 110 111 return false; 112} 113