ARMTargetMachine.cpp revision 876eaf1135b40869f59fb27c87a7d626459e9181
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} 32 33/// TargetMachine ctor - Create an ILP32 architecture model 34/// 35ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS) 36 : Subtarget(M, FS), 37 DataLayout(Subtarget.isTargetDarwin() ? 38 (Subtarget.isThumb() ? 39 std::string("e-p:32:32-d:32:32-l:32:32-s:16:32-b:8:32-B:8:32-A:32") : 40 std::string("e-p:32:32-d:32:32-l:32:32")) : 41 (Subtarget.isThumb() ? 42 std::string("e-p:32:32-d:32:64-l:64:64-s:16:32-b:8:32-B:8:32-A:32") : 43 std::string("e-p:32:32-d:32:64-l:64:64"))), 44 InstrInfo(Subtarget), 45 FrameInfo(Subtarget) {} 46 47unsigned ARMTargetMachine::getModuleMatchQuality(const Module &M) { 48 std::string TT = M.getTargetTriple(); 49 if (TT.size() >= 4 && std::string(TT.begin(), TT.begin()+4) == "arm-") 50 return 20; 51 52 if (M.getPointerSize() == Module::Pointer32) 53 return 1; 54 else 55 return 0; 56} 57 58 59const TargetAsmInfo *ARMTargetMachine::createTargetAsmInfo() const { 60 return new ARMTargetAsmInfo(*this); 61} 62 63 64// Pass Pipeline Configuration 65bool ARMTargetMachine::addInstSelector(FunctionPassManager &PM, bool Fast) { 66 PM.add(createARMISelDag(*this)); 67 return false; 68} 69 70bool ARMTargetMachine::addPreEmitPass(FunctionPassManager &PM, bool Fast) { 71 // FIXME: temporarily disabling load / store optimization pass for Thumb mode. 72 if (!Fast && !DisableLdStOpti && !Subtarget.isThumb()) 73 PM.add(createARMLoadStoreOptimizationPass()); 74 75 PM.add(createARMConstantIslandPass()); 76 return true; 77} 78 79bool ARMTargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast, 80 std::ostream &Out) { 81 // Output assembly language. 82 PM.add(createARMCodePrinterPass(Out, *this)); 83 return false; 84} 85