AArch64TargetMachine.cpp revision 249259
1249259Sdim//===-- AArch64TargetMachine.cpp - Define TargetMachine for AArch64 -------===//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim// This file contains the implementation of the AArch64TargetMachine
11249259Sdim// methods. Principally just setting up the passes needed to generate correct
12249259Sdim// code on this architecture.
13249259Sdim//
14249259Sdim//===----------------------------------------------------------------------===//
15249259Sdim
16249259Sdim#include "AArch64.h"
17249259Sdim#include "AArch64TargetMachine.h"
18249259Sdim#include "MCTargetDesc/AArch64MCTargetDesc.h"
19249259Sdim#include "llvm/PassManager.h"
20249259Sdim#include "llvm/CodeGen/Passes.h"
21249259Sdim#include "llvm/Support/TargetRegistry.h"
22249259Sdim
23249259Sdimusing namespace llvm;
24249259Sdim
25249259Sdimextern "C" void LLVMInitializeAArch64Target() {
26249259Sdim  RegisterTargetMachine<AArch64TargetMachine> X(TheAArch64Target);
27249259Sdim}
28249259Sdim
29249259SdimAArch64TargetMachine::AArch64TargetMachine(const Target &T, StringRef TT,
30249259Sdim                                           StringRef CPU, StringRef FS,
31249259Sdim                                           const TargetOptions &Options,
32249259Sdim                                           Reloc::Model RM, CodeModel::Model CM,
33249259Sdim                                           CodeGenOpt::Level OL)
34249259Sdim  : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
35249259Sdim    Subtarget(TT, CPU, FS),
36249259Sdim    InstrInfo(Subtarget),
37249259Sdim    DL("e-p:64:64-i64:64:64-i128:128:128-s0:32:32-f128:128:128-n32:64-S128"),
38249259Sdim    TLInfo(*this),
39249259Sdim    TSInfo(*this),
40249259Sdim    FrameLowering(Subtarget) {
41249259Sdim}
42249259Sdim
43249259Sdimnamespace {
44249259Sdim/// AArch64 Code Generator Pass Configuration Options.
45249259Sdimclass AArch64PassConfig : public TargetPassConfig {
46249259Sdimpublic:
47249259Sdim  AArch64PassConfig(AArch64TargetMachine *TM, PassManagerBase &PM)
48249259Sdim    : TargetPassConfig(TM, PM) {}
49249259Sdim
50249259Sdim  AArch64TargetMachine &getAArch64TargetMachine() const {
51249259Sdim    return getTM<AArch64TargetMachine>();
52249259Sdim  }
53249259Sdim
54249259Sdim  const AArch64Subtarget &getAArch64Subtarget() const {
55249259Sdim    return *getAArch64TargetMachine().getSubtargetImpl();
56249259Sdim  }
57249259Sdim
58249259Sdim  virtual bool addInstSelector();
59249259Sdim  virtual bool addPreEmitPass();
60249259Sdim};
61249259Sdim} // namespace
62249259Sdim
63249259SdimTargetPassConfig *AArch64TargetMachine::createPassConfig(PassManagerBase &PM) {
64249259Sdim  return new AArch64PassConfig(this, PM);
65249259Sdim}
66249259Sdim
67249259Sdimbool AArch64PassConfig::addPreEmitPass() {
68249259Sdim  addPass(&UnpackMachineBundlesID);
69249259Sdim  addPass(createAArch64BranchFixupPass());
70249259Sdim  return true;
71249259Sdim}
72249259Sdim
73249259Sdimbool AArch64PassConfig::addInstSelector() {
74249259Sdim  addPass(createAArch64ISelDAG(getAArch64TargetMachine(), getOptLevel()));
75249259Sdim
76249259Sdim  // For ELF, cleanup any local-dynamic TLS accesses.
77249259Sdim  if (getAArch64Subtarget().isTargetELF() && getOptLevel() != CodeGenOpt::None)
78249259Sdim    addPass(createAArch64CleanupLocalDynamicTLSPass());
79249259Sdim
80249259Sdim  return false;
81249259Sdim}
82