1 //===-- HexagonELFObjectWriter.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 #include "Hexagon.h" 11 #include "MCTargetDesc/HexagonFixupKinds.h" 12 #include "llvm/MC/MCAssembler.h" 13 #include "llvm/MC/MCELFObjectWriter.h" 14 #include "llvm/Support/Debug.h" 15 #include "llvm/Support/raw_ostream.h" 16 17 #define DEBUG_TYPE "hexagon-elf-writer" 18 19 using namespace llvm; 20 using namespace Hexagon; 21 22 namespace { 23 24 class HexagonELFObjectWriter : public MCELFObjectTargetWriter { 25 private: 26 StringRef CPU; 27 28 public: 29 HexagonELFObjectWriter(uint8_t OSABI, StringRef C); 30 31 unsigned GetRelocType(MCValue const &Target, MCFixup const &Fixup, 32 bool IsPCRel) const override; 33 }; 34 } 35 36 HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C) 37 : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON, 38 /*HasRelocationAddend*/ true), 39 CPU(C) {} 40 41 unsigned HexagonELFObjectWriter::GetRelocType(MCValue const &/*Target*/, 42 MCFixup const &Fixup, 43 bool IsPCRel) const { 44 // determine the type of the relocation 45 unsigned Type = (unsigned)ELF::R_HEX_NONE; 46 unsigned Kind = (unsigned)Fixup.getKind(); 47 48 switch (Kind) { 49 default: 50 DEBUG(dbgs() << "unrecognized relocation " << Fixup.getKind() << "\n"); 51 llvm_unreachable("Unimplemented Fixup kind!"); 52 break; 53 case FK_Data_4: 54 Type = (IsPCRel) ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32; 55 break; 56 case FK_PCRel_4: 57 Type = ELF::R_HEX_32_PCREL; 58 break; 59 case FK_Data_2: 60 Type = ELF::R_HEX_16; 61 break; 62 case FK_Data_1: 63 Type = ELF::R_HEX_8; 64 break; 65 case fixup_Hexagon_B22_PCREL: 66 Type = ELF::R_HEX_B22_PCREL; 67 break; 68 case fixup_Hexagon_B15_PCREL: 69 Type = ELF::R_HEX_B15_PCREL; 70 break; 71 case fixup_Hexagon_B7_PCREL: 72 Type = ELF::R_HEX_B7_PCREL; 73 break; 74 case fixup_Hexagon_LO16: 75 Type = ELF::R_HEX_LO16; 76 break; 77 case fixup_Hexagon_HI16: 78 Type = ELF::R_HEX_HI16; 79 break; 80 case fixup_Hexagon_32: 81 Type = ELF::R_HEX_32; 82 break; 83 case fixup_Hexagon_16: 84 Type = ELF::R_HEX_16; 85 break; 86 case fixup_Hexagon_8: 87 Type = ELF::R_HEX_8; 88 break; 89 case fixup_Hexagon_GPREL16_0: 90 Type = ELF::R_HEX_GPREL16_0; 91 break; 92 case fixup_Hexagon_GPREL16_1: 93 Type = ELF::R_HEX_GPREL16_1; 94 break; 95 case fixup_Hexagon_GPREL16_2: 96 Type = ELF::R_HEX_GPREL16_2; 97 break; 98 case fixup_Hexagon_GPREL16_3: 99 Type = ELF::R_HEX_GPREL16_3; 100 break; 101 case fixup_Hexagon_HL16: 102 Type = ELF::R_HEX_HL16; 103 break; 104 case fixup_Hexagon_B13_PCREL: 105 Type = ELF::R_HEX_B13_PCREL; 106 break; 107 case fixup_Hexagon_B9_PCREL: 108 Type = ELF::R_HEX_B9_PCREL; 109 break; 110 case fixup_Hexagon_B32_PCREL_X: 111 Type = ELF::R_HEX_B32_PCREL_X; 112 break; 113 case fixup_Hexagon_32_6_X: 114 Type = ELF::R_HEX_32_6_X; 115 break; 116 case fixup_Hexagon_B22_PCREL_X: 117 Type = ELF::R_HEX_B22_PCREL_X; 118 break; 119 case fixup_Hexagon_B15_PCREL_X: 120 Type = ELF::R_HEX_B15_PCREL_X; 121 break; 122 case fixup_Hexagon_B13_PCREL_X: 123 Type = ELF::R_HEX_B13_PCREL_X; 124 break; 125 case fixup_Hexagon_B9_PCREL_X: 126 Type = ELF::R_HEX_B9_PCREL_X; 127 break; 128 case fixup_Hexagon_B7_PCREL_X: 129 Type = ELF::R_HEX_B7_PCREL_X; 130 break; 131 case fixup_Hexagon_16_X: 132 Type = ELF::R_HEX_16_X; 133 break; 134 case fixup_Hexagon_12_X: 135 Type = ELF::R_HEX_12_X; 136 break; 137 case fixup_Hexagon_11_X: 138 Type = ELF::R_HEX_11_X; 139 break; 140 case fixup_Hexagon_10_X: 141 Type = ELF::R_HEX_10_X; 142 break; 143 case fixup_Hexagon_9_X: 144 Type = ELF::R_HEX_9_X; 145 break; 146 case fixup_Hexagon_8_X: 147 Type = ELF::R_HEX_8_X; 148 break; 149 case fixup_Hexagon_7_X: 150 Type = ELF::R_HEX_7_X; 151 break; 152 case fixup_Hexagon_6_X: 153 Type = ELF::R_HEX_6_X; 154 break; 155 case fixup_Hexagon_32_PCREL: 156 Type = ELF::R_HEX_32_PCREL; 157 break; 158 case fixup_Hexagon_COPY: 159 Type = ELF::R_HEX_COPY; 160 break; 161 case fixup_Hexagon_GLOB_DAT: 162 Type = ELF::R_HEX_GLOB_DAT; 163 break; 164 case fixup_Hexagon_JMP_SLOT: 165 Type = ELF::R_HEX_JMP_SLOT; 166 break; 167 case fixup_Hexagon_RELATIVE: 168 Type = ELF::R_HEX_RELATIVE; 169 break; 170 case fixup_Hexagon_PLT_B22_PCREL: 171 Type = ELF::R_HEX_PLT_B22_PCREL; 172 break; 173 case fixup_Hexagon_GOTREL_LO16: 174 Type = ELF::R_HEX_GOTREL_LO16; 175 break; 176 case fixup_Hexagon_GOTREL_HI16: 177 Type = ELF::R_HEX_GOTREL_HI16; 178 break; 179 case fixup_Hexagon_GOTREL_32: 180 Type = ELF::R_HEX_GOTREL_32; 181 break; 182 case fixup_Hexagon_GOT_LO16: 183 Type = ELF::R_HEX_GOT_LO16; 184 break; 185 case fixup_Hexagon_GOT_HI16: 186 Type = ELF::R_HEX_GOT_HI16; 187 break; 188 case fixup_Hexagon_GOT_32: 189 Type = ELF::R_HEX_GOT_32; 190 break; 191 case fixup_Hexagon_GOT_16: 192 Type = ELF::R_HEX_GOT_16; 193 break; 194 case fixup_Hexagon_DTPMOD_32: 195 Type = ELF::R_HEX_DTPMOD_32; 196 break; 197 case fixup_Hexagon_DTPREL_LO16: 198 Type = ELF::R_HEX_DTPREL_LO16; 199 break; 200 case fixup_Hexagon_DTPREL_HI16: 201 Type = ELF::R_HEX_DTPREL_HI16; 202 break; 203 case fixup_Hexagon_DTPREL_32: 204 Type = ELF::R_HEX_DTPREL_32; 205 break; 206 case fixup_Hexagon_DTPREL_16: 207 Type = ELF::R_HEX_DTPREL_16; 208 break; 209 case fixup_Hexagon_GD_PLT_B22_PCREL: 210 Type = ELF::R_HEX_GD_PLT_B22_PCREL; 211 break; 212 case fixup_Hexagon_LD_PLT_B22_PCREL: 213 Type = ELF::R_HEX_LD_PLT_B22_PCREL; 214 break; 215 case fixup_Hexagon_GD_GOT_LO16: 216 Type = ELF::R_HEX_GD_GOT_LO16; 217 break; 218 case fixup_Hexagon_GD_GOT_HI16: 219 Type = ELF::R_HEX_GD_GOT_HI16; 220 break; 221 case fixup_Hexagon_GD_GOT_32: 222 Type = ELF::R_HEX_GD_GOT_32; 223 break; 224 case fixup_Hexagon_GD_GOT_16: 225 Type = ELF::R_HEX_GD_GOT_16; 226 break; 227 case fixup_Hexagon_LD_GOT_LO16: 228 Type = ELF::R_HEX_LD_GOT_LO16; 229 break; 230 case fixup_Hexagon_LD_GOT_HI16: 231 Type = ELF::R_HEX_LD_GOT_HI16; 232 break; 233 case fixup_Hexagon_LD_GOT_32: 234 Type = ELF::R_HEX_LD_GOT_32; 235 break; 236 case fixup_Hexagon_LD_GOT_16: 237 Type = ELF::R_HEX_LD_GOT_16; 238 break; 239 case fixup_Hexagon_IE_LO16: 240 Type = ELF::R_HEX_IE_LO16; 241 break; 242 case fixup_Hexagon_IE_HI16: 243 Type = ELF::R_HEX_IE_HI16; 244 break; 245 case fixup_Hexagon_IE_32: 246 Type = ELF::R_HEX_IE_32; 247 break; 248 case fixup_Hexagon_IE_GOT_LO16: 249 Type = ELF::R_HEX_IE_GOT_LO16; 250 break; 251 case fixup_Hexagon_IE_GOT_HI16: 252 Type = ELF::R_HEX_IE_GOT_HI16; 253 break; 254 case fixup_Hexagon_IE_GOT_32: 255 Type = ELF::R_HEX_IE_GOT_32; 256 break; 257 case fixup_Hexagon_IE_GOT_16: 258 Type = ELF::R_HEX_IE_GOT_16; 259 break; 260 case fixup_Hexagon_TPREL_LO16: 261 Type = ELF::R_HEX_TPREL_LO16; 262 break; 263 case fixup_Hexagon_TPREL_HI16: 264 Type = ELF::R_HEX_TPREL_HI16; 265 break; 266 case fixup_Hexagon_TPREL_32: 267 Type = ELF::R_HEX_TPREL_32; 268 break; 269 case fixup_Hexagon_TPREL_16: 270 Type = ELF::R_HEX_TPREL_16; 271 break; 272 case fixup_Hexagon_6_PCREL_X: 273 Type = ELF::R_HEX_6_PCREL_X; 274 break; 275 case fixup_Hexagon_GOTREL_32_6_X: 276 Type = ELF::R_HEX_GOTREL_32_6_X; 277 break; 278 case fixup_Hexagon_GOTREL_16_X: 279 Type = ELF::R_HEX_GOTREL_16_X; 280 break; 281 case fixup_Hexagon_GOTREL_11_X: 282 Type = ELF::R_HEX_GOTREL_11_X; 283 break; 284 case fixup_Hexagon_GOT_32_6_X: 285 Type = ELF::R_HEX_GOT_32_6_X; 286 break; 287 case fixup_Hexagon_GOT_16_X: 288 Type = ELF::R_HEX_GOT_16_X; 289 break; 290 case fixup_Hexagon_GOT_11_X: 291 Type = ELF::R_HEX_GOT_11_X; 292 break; 293 case fixup_Hexagon_DTPREL_32_6_X: 294 Type = ELF::R_HEX_DTPREL_32_6_X; 295 break; 296 case fixup_Hexagon_DTPREL_16_X: 297 Type = ELF::R_HEX_DTPREL_16_X; 298 break; 299 case fixup_Hexagon_DTPREL_11_X: 300 Type = ELF::R_HEX_DTPREL_11_X; 301 break; 302 case fixup_Hexagon_GD_GOT_32_6_X: 303 Type = ELF::R_HEX_GD_GOT_32_6_X; 304 break; 305 case fixup_Hexagon_GD_GOT_16_X: 306 Type = ELF::R_HEX_GD_GOT_16_X; 307 break; 308 case fixup_Hexagon_GD_GOT_11_X: 309 Type = ELF::R_HEX_GD_GOT_11_X; 310 break; 311 case fixup_Hexagon_LD_GOT_32_6_X: 312 Type = ELF::R_HEX_LD_GOT_32_6_X; 313 break; 314 case fixup_Hexagon_LD_GOT_16_X: 315 Type = ELF::R_HEX_LD_GOT_16_X; 316 break; 317 case fixup_Hexagon_LD_GOT_11_X: 318 Type = ELF::R_HEX_LD_GOT_11_X; 319 break; 320 case fixup_Hexagon_IE_32_6_X: 321 Type = ELF::R_HEX_IE_32_6_X; 322 break; 323 case fixup_Hexagon_IE_16_X: 324 Type = ELF::R_HEX_IE_16_X; 325 break; 326 case fixup_Hexagon_IE_GOT_32_6_X: 327 Type = ELF::R_HEX_IE_GOT_32_6_X; 328 break; 329 case fixup_Hexagon_IE_GOT_16_X: 330 Type = ELF::R_HEX_IE_GOT_16_X; 331 break; 332 case fixup_Hexagon_IE_GOT_11_X: 333 Type = ELF::R_HEX_IE_GOT_11_X; 334 break; 335 case fixup_Hexagon_TPREL_32_6_X: 336 Type = ELF::R_HEX_TPREL_32_6_X; 337 break; 338 case fixup_Hexagon_TPREL_16_X: 339 Type = ELF::R_HEX_TPREL_16_X; 340 break; 341 case fixup_Hexagon_TPREL_11_X: 342 Type = ELF::R_HEX_TPREL_11_X; 343 break; 344 } 345 return Type; 346 } 347 348 MCObjectWriter *llvm::createHexagonELFObjectWriter(raw_pwrite_stream &OS, 349 uint8_t OSABI, 350 StringRef CPU) { 351 MCELFObjectTargetWriter *MOTW = new HexagonELFObjectWriter(OSABI, CPU); 352 return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true); 353 } 354