ARMTargetMachine.cpp revision e8308df0b9b34089bb6040f6902ba121441bdf3e
1//===-- ARMTargetMachine.cpp - Define TargetMachine for ARM ---------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the "Instituto Nokia de Tecnologia" and
6// is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10//
11//
12//===----------------------------------------------------------------------===//
13
14#include "ARMTargetMachine.h"
15#include "ARMTargetAsmInfo.h"
16#include "ARMFrameInfo.h"
17#include "ARM.h"
18#include "llvm/Module.h"
19#include "llvm/PassManager.h"
20#include "llvm/Support/CommandLine.h"
21#include "llvm/Target/TargetMachineRegistry.h"
22#include "llvm/Target/TargetOptions.h"
23using namespace llvm;
24
25static cl::opt<bool> DisableLdStOpti("disable-arm-loadstore-opti", cl::Hidden,
26                              cl::desc("Disable load store optimization pass"));
27
28namespace {
29  // Register the target.
30  RegisterTarget<ARMTargetMachine>   X("arm",   "  ARM");
31  RegisterTarget<ThumbTargetMachine> Y("thumb", "  Thumb");
32}
33
34/// ThumbTargetMachine - Create an Thumb architecture model.
35///
36unsigned ThumbTargetMachine::getModuleMatchQuality(const Module &M) {
37  std::string TT = M.getTargetTriple();
38  if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "thumb-")
39    return 20;
40
41  return M.getPointerSize() == Module::Pointer32;
42}
43
44ThumbTargetMachine::ThumbTargetMachine(const Module &M, const std::string &FS)
45  : ARMTargetMachine(M, FS, true) {
46}
47
48/// TargetMachine ctor - Create an ARM architecture model.
49///
50ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS,
51                                   bool isThumb)
52  : Subtarget(M, FS, isThumb),
53    DataLayout(Subtarget.isAPCS_ABI() ?
54               // APCS ABI
55          (isThumb ?
56           std::string("e-p:32:32-f64:32:32-i64:32:32-"
57                       "i16:16:32-i8:8:32-i1:8:32-a:0:32") :
58           std::string("e-p:32:32-f64:32:32-i64:32:32")) :
59               // AAPCS ABI
60          (isThumb ?
61           std::string("e-p:32:32-f64:64:64-i64:64:64-"
62                       "i16:16:32-i8:8:32-i1:8:32-a:0:32") :
63           std::string("e-p:32:32-f64:64:64-i64:64:64"))),
64    InstrInfo(Subtarget),
65    FrameInfo(Subtarget),
66    TLInfo(*this) {}
67
68unsigned ARMTargetMachine::getModuleMatchQuality(const Module &M) {
69  std::string TT = M.getTargetTriple();
70  if (TT.size() >= 4 && std::string(TT.begin(), TT.begin()+4) == "arm-")
71    return 20;
72
73  return M.getPointerSize() == Module::Pointer32;
74}
75
76
77const TargetAsmInfo *ARMTargetMachine::createTargetAsmInfo() const {
78  return new ARMTargetAsmInfo(*this);
79}
80
81
82// Pass Pipeline Configuration
83bool ARMTargetMachine::addInstSelector(FunctionPassManager &PM, bool Fast) {
84  PM.add(createARMISelDag(*this));
85  return false;
86}
87
88bool ARMTargetMachine::addPreEmitPass(FunctionPassManager &PM, bool Fast) {
89  // FIXME: temporarily disabling load / store optimization pass for Thumb mode.
90  if (!Fast && !DisableLdStOpti && !Subtarget.isThumb())
91    PM.add(createARMLoadStoreOptimizationPass());
92
93  PM.add(createARMConstantIslandPass());
94  return true;
95}
96
97bool ARMTargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast,
98                                          std::ostream &Out) {
99  // Output assembly language.
100  PM.add(createARMCodePrinterPass(Out, *this));
101  return false;
102}
103