/src/keystone/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
Line | Count | Source |
1 | | //===-- HexagonMCTargetDesc.cpp - Hexagon 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 Hexagon specific target descriptions. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #include "HexagonMCTargetDesc.h" |
15 | | #include "Hexagon.h" |
16 | | #include "HexagonMCAsmInfo.h" |
17 | | #include "HexagonMCELFStreamer.h" |
18 | | #include "llvm/ADT/STLExtras.h" |
19 | | #include "llvm/MC/MCContext.h" |
20 | | #include "llvm/MC/MCELFStreamer.h" |
21 | | #include "llvm/MC/MCInstrInfo.h" |
22 | | #include "llvm/MC/MCObjectStreamer.h" |
23 | | #include "llvm/MC/MCRegisterInfo.h" |
24 | | #include "llvm/MC/MCStreamer.h" |
25 | | #include "llvm/MC/MCSubtargetInfo.h" |
26 | | #include "llvm/MC/MachineLocation.h" |
27 | | #include "llvm/Support/ELF.h" |
28 | | #include "llvm/Support/ErrorHandling.h" |
29 | | #include "llvm/Support/TargetRegistry.h" |
30 | | |
31 | | using namespace llvm_ks; |
32 | | |
33 | | #define GET_INSTRINFO_MC_DESC |
34 | | #include "HexagonGenInstrInfo.inc" |
35 | | |
36 | | #define GET_SUBTARGETINFO_MC_DESC |
37 | | #include "HexagonGenSubtargetInfo.inc" |
38 | | |
39 | | #define GET_REGINFO_MC_DESC |
40 | | #include "HexagonGenRegisterInfo.inc" |
41 | | |
42 | | bool llvm_ks::HexagonDisableCompound; |
43 | | |
44 | | bool llvm_ks::HexagonDisableDuplex; |
45 | | |
46 | 3.01k | StringRef HEXAGON_MC::selectHexagonCPU(const Triple &TT, StringRef CPU) { |
47 | 3.01k | if (CPU.empty()) |
48 | 3.01k | CPU = "hexagonv60"; |
49 | 3.01k | return CPU; |
50 | 3.01k | } |
51 | | |
52 | 6.02k | MCInstrInfo *llvm_ks::createHexagonMCInstrInfo() { |
53 | 6.02k | MCInstrInfo *X = new MCInstrInfo(); |
54 | 6.02k | InitHexagonMCInstrInfo(X); |
55 | 6.02k | return X; |
56 | 6.02k | } |
57 | | |
58 | 3.01k | static MCRegisterInfo *createHexagonMCRegisterInfo(const Triple &TT) { |
59 | 3.01k | MCRegisterInfo *X = new MCRegisterInfo(); |
60 | 3.01k | InitHexagonMCRegisterInfo(X, Hexagon::R0); |
61 | 3.01k | return X; |
62 | 3.01k | } |
63 | | |
64 | | static MCSubtargetInfo * |
65 | 3.01k | createHexagonMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { |
66 | 3.01k | CPU = HEXAGON_MC::selectHexagonCPU(TT, CPU); |
67 | 3.01k | return createHexagonMCSubtargetInfoImpl(TT, CPU, FS); |
68 | 3.01k | } |
69 | | |
70 | | namespace { |
71 | | class HexagonTargetELFStreamer : public HexagonTargetStreamer { |
72 | | public: |
73 | 0 | MCELFStreamer &getStreamer() { |
74 | 0 | return static_cast<MCELFStreamer &>(Streamer); |
75 | 0 | } |
76 | | HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo const &STI) |
77 | 0 | : HexagonTargetStreamer(S) { |
78 | 0 | auto Bits = STI.getFeatureBits(); |
79 | 0 | unsigned Flags; |
80 | 0 | if (Bits.to_ullong() & llvm_ks::Hexagon::ArchV5) |
81 | 0 | Flags = ELF::EF_HEXAGON_MACH_V5; |
82 | 0 | else |
83 | 0 | Flags = ELF::EF_HEXAGON_MACH_V4; |
84 | 0 | getStreamer().getAssembler().setELFHeaderEFlags(Flags); |
85 | 0 | } |
86 | | void EmitCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size, |
87 | | unsigned ByteAlignment, |
88 | 0 | unsigned AccessSize) override { |
89 | 0 | HexagonMCELFStreamer &HexagonELFStreamer = |
90 | 0 | static_cast<HexagonMCELFStreamer &>(getStreamer()); |
91 | 0 | HexagonELFStreamer.HexagonMCEmitCommonSymbol(Symbol, Size, ByteAlignment, |
92 | 0 | AccessSize); |
93 | 0 | } |
94 | | void EmitLocalCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size, |
95 | | unsigned ByteAlignment, |
96 | 0 | unsigned AccessSize) override { |
97 | 0 | HexagonMCELFStreamer &HexagonELFStreamer = |
98 | 0 | static_cast<HexagonMCELFStreamer &>(getStreamer()); |
99 | 0 | HexagonELFStreamer.HexagonMCEmitLocalCommonSymbol( |
100 | 0 | Symbol, Size, ByteAlignment, AccessSize); |
101 | 0 | } |
102 | | }; |
103 | | } |
104 | | |
105 | | static MCAsmInfo *createHexagonMCAsmInfo(const MCRegisterInfo &MRI, |
106 | 3.01k | const Triple &TT) { |
107 | 3.01k | MCAsmInfo *MAI = new HexagonMCAsmInfo(TT); |
108 | | |
109 | | // VirtualFP = (R30 + #0). |
110 | 3.01k | MCCFIInstruction Inst = |
111 | 3.01k | MCCFIInstruction::createDefCfa(nullptr, Hexagon::R30, 0); |
112 | 3.01k | MAI->addInitialFrameState(Inst); |
113 | | |
114 | 3.01k | return MAI; |
115 | 3.01k | } |
116 | | |
117 | | // Force static initialization. |
118 | 25 | extern "C" void LLVMInitializeHexagonTargetMC() { |
119 | | // Register the MC asm info. |
120 | 25 | RegisterMCAsmInfoFn X(TheHexagonTarget, createHexagonMCAsmInfo); |
121 | | |
122 | | // Register the MC instruction info. |
123 | 25 | TargetRegistry::RegisterMCInstrInfo(TheHexagonTarget, |
124 | 25 | createHexagonMCInstrInfo); |
125 | | |
126 | | // Register the MC register info. |
127 | 25 | TargetRegistry::RegisterMCRegInfo(TheHexagonTarget, |
128 | 25 | createHexagonMCRegisterInfo); |
129 | | |
130 | | // Register the MC subtarget info. |
131 | 25 | TargetRegistry::RegisterMCSubtargetInfo(TheHexagonTarget, |
132 | 25 | createHexagonMCSubtargetInfo); |
133 | | |
134 | | // Register the MC Code Emitter |
135 | 25 | TargetRegistry::RegisterMCCodeEmitter(TheHexagonTarget, |
136 | 25 | createHexagonMCCodeEmitter); |
137 | | |
138 | | // Register the asm backend |
139 | 25 | TargetRegistry::RegisterMCAsmBackend(TheHexagonTarget, |
140 | 25 | createHexagonAsmBackend); |
141 | 25 | } |