/src/keystone/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
Line | Count | Source |
1 | | //===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===// |
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 | | // This file provides Sparc specific target descriptions. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #include "SparcMCTargetDesc.h" |
15 | | #include "llvm/ADT/STLExtras.h" |
16 | | #include "SparcMCAsmInfo.h" |
17 | | #include "SparcTargetStreamer.h" |
18 | | #include "llvm/MC/MCInstrInfo.h" |
19 | | #include "llvm/MC/MCRegisterInfo.h" |
20 | | #include "llvm/MC/MCSubtargetInfo.h" |
21 | | #include "llvm/Support/ErrorHandling.h" |
22 | | #include "llvm/Support/TargetRegistry.h" |
23 | | |
24 | | using namespace llvm_ks; |
25 | | |
26 | | #define GET_INSTRINFO_MC_DESC |
27 | | #include "SparcGenInstrInfo.inc" |
28 | | |
29 | | #define GET_SUBTARGETINFO_MC_DESC |
30 | | #include "SparcGenSubtargetInfo.inc" |
31 | | |
32 | | #define GET_REGINFO_MC_DESC |
33 | | #include "SparcGenRegisterInfo.inc" |
34 | | |
35 | | static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI, |
36 | 10.5k | const Triple &TT) { |
37 | 10.5k | MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT); |
38 | 10.5k | unsigned Reg = MRI.getDwarfRegNum(SP::O6, true); |
39 | 10.5k | MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0); |
40 | 10.5k | MAI->addInitialFrameState(Inst); |
41 | 10.5k | return MAI; |
42 | 10.5k | } |
43 | | |
44 | | static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI, |
45 | 0 | const Triple &TT) { |
46 | 0 | MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT); |
47 | 0 | unsigned Reg = MRI.getDwarfRegNum(SP::O6, true); |
48 | 0 | MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 2047); |
49 | 0 | MAI->addInitialFrameState(Inst); |
50 | 0 | return MAI; |
51 | 0 | } |
52 | | |
53 | 10.5k | static MCInstrInfo *createSparcMCInstrInfo() { |
54 | 10.5k | MCInstrInfo *X = new MCInstrInfo(); |
55 | 10.5k | InitSparcMCInstrInfo(X); |
56 | 10.5k | return X; |
57 | 10.5k | } |
58 | | |
59 | 10.5k | static MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) { |
60 | 10.5k | MCRegisterInfo *X = new MCRegisterInfo(); |
61 | 10.5k | InitSparcMCRegisterInfo(X, SP::O7); |
62 | 10.5k | return X; |
63 | 10.5k | } |
64 | | |
65 | | static MCSubtargetInfo * |
66 | 10.5k | createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { |
67 | 10.5k | if (CPU.empty()) |
68 | 10.5k | CPU = (TT.getArch() == Triple::sparcv9) ? "v9" : "v8"; |
69 | 10.5k | return createSparcMCSubtargetInfoImpl(TT, CPU, FS); |
70 | 10.5k | } |
71 | | |
72 | | // Code models. Some only make sense for 64-bit code. |
73 | | // |
74 | | // SunCC Reloc CodeModel Constraints |
75 | | // abs32 Static Small text+data+bss linked below 2^32 bytes |
76 | | // abs44 Static Medium text+data+bss linked below 2^44 bytes |
77 | | // abs64 Static Large text smaller than 2^31 bytes |
78 | | // pic13 PIC_ Small GOT < 2^13 bytes |
79 | | // pic32 PIC_ Medium GOT < 2^32 bytes |
80 | | // |
81 | | // All code models require that the text segment is smaller than 2GB. |
82 | | |
83 | 25 | extern "C" void LLVMInitializeSparcTargetMC() { |
84 | | // Register the MC asm info. |
85 | 25 | RegisterMCAsmInfoFn X(TheSparcTarget, createSparcMCAsmInfo); |
86 | 25 | RegisterMCAsmInfoFn Y(TheSparcV9Target, createSparcV9MCAsmInfo); |
87 | 25 | RegisterMCAsmInfoFn Z(TheSparcelTarget, createSparcMCAsmInfo); |
88 | | |
89 | 75 | for (Target *T : {&TheSparcTarget, &TheSparcV9Target, &TheSparcelTarget}) { |
90 | | // Register the MC instruction info. |
91 | 75 | TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo); |
92 | | |
93 | | // Register the MC register info. |
94 | 75 | TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo); |
95 | | |
96 | | // Register the MC subtarget info. |
97 | 75 | TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo); |
98 | | |
99 | | // Register the MC Code Emitter. |
100 | 75 | TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter); |
101 | | |
102 | | // Register the asm backend. |
103 | 75 | TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend); |
104 | 75 | } |
105 | 25 | } |