/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/lib/Target/MSP430/MSP430TargetMachine.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- MSP430TargetMachine.cpp - Define TargetMachine for MSP430 ---------===// |
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 | | // Top-level implementation for the MSP430 target. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #include "MSP430TargetMachine.h" |
15 | | #include "MSP430.h" |
16 | | #include "llvm/CodeGen/Passes.h" |
17 | | #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" |
18 | | #include "llvm/CodeGen/TargetPassConfig.h" |
19 | | #include "llvm/IR/LegacyPassManager.h" |
20 | | #include "llvm/MC/MCAsmInfo.h" |
21 | | #include "llvm/Support/TargetRegistry.h" |
22 | | using namespace llvm; |
23 | | |
24 | 123k | extern "C" void LLVMInitializeMSP430Target() { |
25 | 123k | // Register the target. |
26 | 123k | RegisterTargetMachine<MSP430TargetMachine> X(getTheMSP430Target()); |
27 | 123k | } |
28 | | |
29 | 64 | static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) { |
30 | 64 | if (!RM.hasValue()) |
31 | 63 | return Reloc::Static; |
32 | 1 | return *RM; |
33 | 1 | } |
34 | | |
35 | 64 | static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) { |
36 | 64 | if (CM) |
37 | 0 | return *CM; |
38 | 64 | return CodeModel::Small; |
39 | 64 | } |
40 | | |
41 | | static std::string computeDataLayout(const Triple &TT, StringRef CPU, |
42 | 64 | const TargetOptions &Options) { |
43 | 64 | return "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"; |
44 | 64 | } |
45 | | |
46 | | MSP430TargetMachine::MSP430TargetMachine(const Target &T, const Triple &TT, |
47 | | StringRef CPU, StringRef FS, |
48 | | const TargetOptions &Options, |
49 | | Optional<Reloc::Model> RM, |
50 | | Optional<CodeModel::Model> CM, |
51 | | CodeGenOpt::Level OL, bool JIT) |
52 | | : LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options), TT, CPU, FS, |
53 | | Options, getEffectiveRelocModel(RM), |
54 | | getEffectiveCodeModel(CM), OL), |
55 | | TLOF(make_unique<TargetLoweringObjectFileELF>()), |
56 | 64 | Subtarget(TT, CPU, FS, *this) { |
57 | 64 | initAsmInfo(); |
58 | 64 | } |
59 | | |
60 | 64 | MSP430TargetMachine::~MSP430TargetMachine() {} |
61 | | |
62 | | namespace { |
63 | | /// MSP430 Code Generator Pass Configuration Options. |
64 | | class MSP430PassConfig : public TargetPassConfig { |
65 | | public: |
66 | | MSP430PassConfig(MSP430TargetMachine &TM, PassManagerBase &PM) |
67 | 63 | : TargetPassConfig(TM, PM) {} |
68 | | |
69 | 63 | MSP430TargetMachine &getMSP430TargetMachine() const { |
70 | 63 | return getTM<MSP430TargetMachine>(); |
71 | 63 | } |
72 | | |
73 | | bool addInstSelector() override; |
74 | | void addPreEmitPass() override; |
75 | | }; |
76 | | } // namespace |
77 | | |
78 | 63 | TargetPassConfig *MSP430TargetMachine::createPassConfig(PassManagerBase &PM) { |
79 | 63 | return new MSP430PassConfig(*this, PM); |
80 | 63 | } |
81 | | |
82 | 63 | bool MSP430PassConfig::addInstSelector() { |
83 | 63 | // Install an instruction selector. |
84 | 63 | addPass(createMSP430ISelDag(getMSP430TargetMachine(), getOptLevel())); |
85 | 63 | return false; |
86 | 63 | } |
87 | | |
88 | 63 | void MSP430PassConfig::addPreEmitPass() { |
89 | 63 | // Must run branch selection immediately preceding the asm printer. |
90 | 63 | addPass(createMSP430BranchSelectionPass(), false); |
91 | 63 | } |