ARMTargetMachine.cpp revision 75604f81b7706f7a0276c8306e944a6a6bc70aa1
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/CodeGen/Passes.h"
21#include "llvm/Support/CommandLine.h"
22#include "llvm/Target/TargetMachineRegistry.h"
23#include "llvm/Target/TargetOptions.h"
24using namespace llvm;
25
26static cl::opt<bool> DisableLdStOpti("disable-arm-loadstore-opti", cl::Hidden,
27                              cl::desc("Disable load store optimization pass"));
28static cl::opt<bool> EnableIfConversion("enable-arm-if-conversion", cl::Hidden,
29                              cl::desc("Enable if-conversion pass"));
30
31namespace {
32  // Register the target.
33  RegisterTarget<ARMTargetMachine>   X("arm",   "  ARM");
34  RegisterTarget<ThumbTargetMachine> Y("thumb", "  Thumb");
35}
36
37/// ThumbTargetMachine - Create an Thumb architecture model.
38///
39unsigned ThumbTargetMachine::getModuleMatchQuality(const Module &M) {
40  std::string TT = M.getTargetTriple();
41  if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "thumb-")
42    return 20;
43
44  return M.getPointerSize() == Module::Pointer32;
45}
46
47ThumbTargetMachine::ThumbTargetMachine(const Module &M, const std::string &FS)
48  : ARMTargetMachine(M, FS, true) {
49}
50
51/// TargetMachine ctor - Create an ARM architecture model.
52///
53ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS,
54                                   bool isThumb)
55  : Subtarget(M, FS, isThumb),
56    DataLayout(Subtarget.isAPCS_ABI() ?
57               // APCS ABI
58          (isThumb ?
59           std::string("e-p:32:32-f64:32:32-i64:32:32-"
60                       "i16:16:32-i8:8:32-i1:8:32-a:0:32") :
61           std::string("e-p:32:32-f64:32:32-i64:32:32")) :
62               // AAPCS ABI
63          (isThumb ?
64           std::string("e-p:32:32-f64:64:64-i64:64:64-"
65                       "i16:16:32-i8:8:32-i1:8:32-a:0:32") :
66           std::string("e-p:32:32-f64:64:64-i64:64:64"))),
67    InstrInfo(Subtarget),
68    FrameInfo(Subtarget),
69    TLInfo(*this) {}
70
71unsigned ARMTargetMachine::getModuleMatchQuality(const Module &M) {
72  std::string TT = M.getTargetTriple();
73  if (TT.size() >= 4 && std::string(TT.begin(), TT.begin()+4) == "arm-")
74    return 20;
75
76  return M.getPointerSize() == Module::Pointer32;
77}
78
79
80const TargetAsmInfo *ARMTargetMachine::createTargetAsmInfo() const {
81  return new ARMTargetAsmInfo(*this);
82}
83
84
85// Pass Pipeline Configuration
86bool ARMTargetMachine::addInstSelector(FunctionPassManager &PM, bool Fast) {
87  PM.add(createARMISelDag(*this));
88  return false;
89}
90
91bool ARMTargetMachine::addPreEmitPass(FunctionPassManager &PM, bool Fast) {
92  // FIXME: temporarily disabling load / store optimization pass for Thumb mode.
93  if (!Fast && !DisableLdStOpti && !Subtarget.isThumb())
94    PM.add(createARMLoadStoreOptimizationPass());
95
96  if (!Fast && EnableIfConversion && !Subtarget.isThumb())
97    PM.add(createIfConverterPass());
98
99  PM.add(createARMConstantIslandPass());
100  return true;
101}
102
103bool ARMTargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast,
104                                          std::ostream &Out) {
105  // Output assembly language.
106  PM.add(createARMCodePrinterPass(Out, *this));
107  return false;
108}
109