314 lines · cpp
1//===-- HexagonELFObjectWriter.cpp - Hexagon Target Descriptions ----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "MCTargetDesc/HexagonFixupKinds.h"10#include "MCTargetDesc/HexagonMCExpr.h"11#include "MCTargetDesc/HexagonMCTargetDesc.h"12#include "llvm/MC/MCAssembler.h"13#include "llvm/MC/MCELFObjectWriter.h"14#include "llvm/MC/MCObjectWriter.h"15#include "llvm/MC/MCValue.h"16 17#define DEBUG_TYPE "hexagon-elf-writer"18 19using namespace llvm;20using namespace Hexagon;21 22namespace {23 24class HexagonELFObjectWriter : public MCELFObjectTargetWriter {25private:26 StringRef CPU;27 28public:29 HexagonELFObjectWriter(uint8_t OSABI, StringRef C);30 31 unsigned getRelocType(const MCFixup &, const MCValue &,32 bool IsPCRel) const override;33};34}35 36HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)37 : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,38 /*HasRelocationAddend*/ true),39 CPU(C) {}40 41unsigned HexagonELFObjectWriter::getRelocType(const MCFixup &Fixup,42 const MCValue &Target,43 bool IsPCRel) const {44 auto Variant = HexagonMCExpr::VariantKind(Target.getSpecifier());45 switch (Variant) {46 case HexagonMCExpr::VK_GD_GOT:47 case HexagonMCExpr::VK_LD_GOT:48 case HexagonMCExpr::VK_GD_PLT:49 case HexagonMCExpr::VK_LD_PLT:50 case HexagonMCExpr::VK_IE:51 case HexagonMCExpr::VK_IE_GOT:52 case HexagonMCExpr::VK_TPREL:53 if (auto *SA = const_cast<MCSymbol *>(Target.getAddSym()))54 static_cast<MCSymbolELF *>(SA)->setType(ELF::STT_TLS);55 break;56 default:57 break;58 }59 switch (Fixup.getKind()) {60 default:61 report_fatal_error("Unrecognized relocation type");62 break;63 case FK_Data_4:64 switch (Variant) {65 case HexagonMCExpr::VK_DTPREL:66 return ELF::R_HEX_DTPREL_32;67 case HexagonMCExpr::VK_GOT:68 return ELF::R_HEX_GOT_32;69 case HexagonMCExpr::VK_GOTREL:70 return ELF::R_HEX_GOTREL_32;71 case HexagonMCExpr::VK_GD_GOT:72 return ELF::R_HEX_GD_GOT_32;73 case HexagonMCExpr::VK_IE:74 return ELF::R_HEX_IE_32;75 case HexagonMCExpr::VK_IE_GOT:76 return ELF::R_HEX_IE_GOT_32;77 case HexagonMCExpr::VK_LD_GOT:78 return ELF::R_HEX_LD_GOT_32;79 case HexagonMCExpr::VK_PCREL:80 return ELF::R_HEX_32_PCREL;81 case HexagonMCExpr::VK_TPREL:82 return ELF::R_HEX_TPREL_32;83 case HexagonMCExpr::VK_None:84 return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;85 default:86 report_fatal_error("Unrecognized variant type");87 };88 case FK_Data_2:89 switch(Variant) {90 case HexagonMCExpr::VK_DTPREL:91 return ELF::R_HEX_DTPREL_16;92 case HexagonMCExpr::VK_GOT:93 return ELF::R_HEX_GOT_16;94 case HexagonMCExpr::VK_GD_GOT:95 return ELF::R_HEX_GD_GOT_16;96 case HexagonMCExpr::VK_IE_GOT:97 return ELF::R_HEX_IE_GOT_16;98 case HexagonMCExpr::VK_LD_GOT:99 return ELF::R_HEX_LD_GOT_16;100 case HexagonMCExpr::VK_TPREL:101 return ELF::R_HEX_TPREL_16;102 case HexagonMCExpr::VK_None:103 return ELF::R_HEX_16;104 default:105 report_fatal_error("Unrecognized variant type");106 };107 case FK_Data_1:108 return ELF::R_HEX_8;109 case fixup_Hexagon_B22_PCREL:110 return ELF::R_HEX_B22_PCREL;111 case fixup_Hexagon_B15_PCREL:112 return ELF::R_HEX_B15_PCREL;113 case fixup_Hexagon_B7_PCREL:114 return ELF::R_HEX_B7_PCREL;115 case fixup_Hexagon_LO16:116 return ELF::R_HEX_LO16;117 case fixup_Hexagon_HI16:118 return ELF::R_HEX_HI16;119 case fixup_Hexagon_32:120 return ELF::R_HEX_32;121 case fixup_Hexagon_16:122 return ELF::R_HEX_16;123 case fixup_Hexagon_8:124 return ELF::R_HEX_8;125 case fixup_Hexagon_GPREL16_0:126 return ELF::R_HEX_GPREL16_0;127 case fixup_Hexagon_GPREL16_1:128 return ELF::R_HEX_GPREL16_1;129 case fixup_Hexagon_GPREL16_2:130 return ELF::R_HEX_GPREL16_2;131 case fixup_Hexagon_GPREL16_3:132 return ELF::R_HEX_GPREL16_3;133 case fixup_Hexagon_HL16:134 return ELF::R_HEX_HL16;135 case fixup_Hexagon_B13_PCREL:136 return ELF::R_HEX_B13_PCREL;137 case fixup_Hexagon_B9_PCREL:138 return ELF::R_HEX_B9_PCREL;139 case fixup_Hexagon_B32_PCREL_X:140 return ELF::R_HEX_B32_PCREL_X;141 case fixup_Hexagon_32_6_X:142 return ELF::R_HEX_32_6_X;143 case fixup_Hexagon_B22_PCREL_X:144 return ELF::R_HEX_B22_PCREL_X;145 case fixup_Hexagon_B15_PCREL_X:146 return ELF::R_HEX_B15_PCREL_X;147 case fixup_Hexagon_B13_PCREL_X:148 return ELF::R_HEX_B13_PCREL_X;149 case fixup_Hexagon_B9_PCREL_X:150 return ELF::R_HEX_B9_PCREL_X;151 case fixup_Hexagon_B7_PCREL_X:152 return ELF::R_HEX_B7_PCREL_X;153 case fixup_Hexagon_16_X:154 return ELF::R_HEX_16_X;155 case fixup_Hexagon_12_X:156 return ELF::R_HEX_12_X;157 case fixup_Hexagon_11_X:158 return ELF::R_HEX_11_X;159 case fixup_Hexagon_10_X:160 return ELF::R_HEX_10_X;161 case fixup_Hexagon_9_X:162 return ELF::R_HEX_9_X;163 case fixup_Hexagon_8_X:164 return ELF::R_HEX_8_X;165 case fixup_Hexagon_7_X:166 return ELF::R_HEX_7_X;167 case fixup_Hexagon_6_X:168 return ELF::R_HEX_6_X;169 case fixup_Hexagon_32_PCREL:170 return ELF::R_HEX_32_PCREL;171 case fixup_Hexagon_COPY:172 return ELF::R_HEX_COPY;173 case fixup_Hexagon_GLOB_DAT:174 return ELF::R_HEX_GLOB_DAT;175 case fixup_Hexagon_JMP_SLOT:176 return ELF::R_HEX_JMP_SLOT;177 case fixup_Hexagon_RELATIVE:178 return ELF::R_HEX_RELATIVE;179 case fixup_Hexagon_PLT_B22_PCREL:180 return ELF::R_HEX_PLT_B22_PCREL;181 case fixup_Hexagon_GOTREL_LO16:182 return ELF::R_HEX_GOTREL_LO16;183 case fixup_Hexagon_GOTREL_HI16:184 return ELF::R_HEX_GOTREL_HI16;185 case fixup_Hexagon_GOTREL_32:186 return ELF::R_HEX_GOTREL_32;187 case fixup_Hexagon_GOT_LO16:188 return ELF::R_HEX_GOT_LO16;189 case fixup_Hexagon_GOT_HI16:190 return ELF::R_HEX_GOT_HI16;191 case fixup_Hexagon_GOT_32:192 return ELF::R_HEX_GOT_32;193 case fixup_Hexagon_GOT_16:194 return ELF::R_HEX_GOT_16;195 case fixup_Hexagon_DTPMOD_32:196 return ELF::R_HEX_DTPMOD_32;197 case fixup_Hexagon_DTPREL_LO16:198 return ELF::R_HEX_DTPREL_LO16;199 case fixup_Hexagon_DTPREL_HI16:200 return ELF::R_HEX_DTPREL_HI16;201 case fixup_Hexagon_DTPREL_32:202 return ELF::R_HEX_DTPREL_32;203 case fixup_Hexagon_DTPREL_16:204 return ELF::R_HEX_DTPREL_16;205 case fixup_Hexagon_GD_PLT_B22_PCREL:206 return ELF::R_HEX_GD_PLT_B22_PCREL;207 case fixup_Hexagon_LD_PLT_B22_PCREL:208 return ELF::R_HEX_LD_PLT_B22_PCREL;209 case fixup_Hexagon_GD_GOT_LO16:210 return ELF::R_HEX_GD_GOT_LO16;211 case fixup_Hexagon_GD_GOT_HI16:212 return ELF::R_HEX_GD_GOT_HI16;213 case fixup_Hexagon_GD_GOT_32:214 return ELF::R_HEX_GD_GOT_32;215 case fixup_Hexagon_GD_GOT_16:216 return ELF::R_HEX_GD_GOT_16;217 case fixup_Hexagon_LD_GOT_LO16:218 return ELF::R_HEX_LD_GOT_LO16;219 case fixup_Hexagon_LD_GOT_HI16:220 return ELF::R_HEX_LD_GOT_HI16;221 case fixup_Hexagon_LD_GOT_32:222 return ELF::R_HEX_LD_GOT_32;223 case fixup_Hexagon_LD_GOT_16:224 return ELF::R_HEX_LD_GOT_16;225 case fixup_Hexagon_IE_LO16:226 return ELF::R_HEX_IE_LO16;227 case fixup_Hexagon_IE_HI16:228 return ELF::R_HEX_IE_HI16;229 case fixup_Hexagon_IE_32:230 return ELF::R_HEX_IE_32;231 case fixup_Hexagon_IE_GOT_LO16:232 return ELF::R_HEX_IE_GOT_LO16;233 case fixup_Hexagon_IE_GOT_HI16:234 return ELF::R_HEX_IE_GOT_HI16;235 case fixup_Hexagon_IE_GOT_32:236 return ELF::R_HEX_IE_GOT_32;237 case fixup_Hexagon_IE_GOT_16:238 return ELF::R_HEX_IE_GOT_16;239 case fixup_Hexagon_TPREL_LO16:240 return ELF::R_HEX_TPREL_LO16;241 case fixup_Hexagon_TPREL_HI16:242 return ELF::R_HEX_TPREL_HI16;243 case fixup_Hexagon_TPREL_32:244 return ELF::R_HEX_TPREL_32;245 case fixup_Hexagon_TPREL_16:246 return ELF::R_HEX_TPREL_16;247 case fixup_Hexagon_6_PCREL_X:248 return ELF::R_HEX_6_PCREL_X;249 case fixup_Hexagon_GOTREL_32_6_X:250 return ELF::R_HEX_GOTREL_32_6_X;251 case fixup_Hexagon_GOTREL_16_X:252 return ELF::R_HEX_GOTREL_16_X;253 case fixup_Hexagon_GOTREL_11_X:254 return ELF::R_HEX_GOTREL_11_X;255 case fixup_Hexagon_GOT_32_6_X:256 return ELF::R_HEX_GOT_32_6_X;257 case fixup_Hexagon_GOT_16_X:258 return ELF::R_HEX_GOT_16_X;259 case fixup_Hexagon_GOT_11_X:260 return ELF::R_HEX_GOT_11_X;261 case fixup_Hexagon_DTPREL_32_6_X:262 return ELF::R_HEX_DTPREL_32_6_X;263 case fixup_Hexagon_DTPREL_16_X:264 return ELF::R_HEX_DTPREL_16_X;265 case fixup_Hexagon_DTPREL_11_X:266 return ELF::R_HEX_DTPREL_11_X;267 case fixup_Hexagon_GD_GOT_32_6_X:268 return ELF::R_HEX_GD_GOT_32_6_X;269 case fixup_Hexagon_GD_GOT_16_X:270 return ELF::R_HEX_GD_GOT_16_X;271 case fixup_Hexagon_GD_GOT_11_X:272 return ELF::R_HEX_GD_GOT_11_X;273 case fixup_Hexagon_LD_GOT_32_6_X:274 return ELF::R_HEX_LD_GOT_32_6_X;275 case fixup_Hexagon_LD_GOT_16_X:276 return ELF::R_HEX_LD_GOT_16_X;277 case fixup_Hexagon_LD_GOT_11_X:278 return ELF::R_HEX_LD_GOT_11_X;279 case fixup_Hexagon_IE_32_6_X:280 return ELF::R_HEX_IE_32_6_X;281 case fixup_Hexagon_IE_16_X:282 return ELF::R_HEX_IE_16_X;283 case fixup_Hexagon_IE_GOT_32_6_X:284 return ELF::R_HEX_IE_GOT_32_6_X;285 case fixup_Hexagon_IE_GOT_16_X:286 return ELF::R_HEX_IE_GOT_16_X;287 case fixup_Hexagon_IE_GOT_11_X:288 return ELF::R_HEX_IE_GOT_11_X;289 case fixup_Hexagon_TPREL_32_6_X:290 return ELF::R_HEX_TPREL_32_6_X;291 case fixup_Hexagon_TPREL_16_X:292 return ELF::R_HEX_TPREL_16_X;293 case fixup_Hexagon_TPREL_11_X:294 return ELF::R_HEX_TPREL_11_X;295 case fixup_Hexagon_23_REG:296 return ELF::R_HEX_23_REG;297 case fixup_Hexagon_27_REG:298 return ELF::R_HEX_27_REG;299 case fixup_Hexagon_GD_PLT_B22_PCREL_X:300 return ELF::R_HEX_GD_PLT_B22_PCREL_X;301 case fixup_Hexagon_GD_PLT_B32_PCREL_X:302 return ELF::R_HEX_GD_PLT_B32_PCREL_X;303 case fixup_Hexagon_LD_PLT_B22_PCREL_X:304 return ELF::R_HEX_LD_PLT_B22_PCREL_X;305 case fixup_Hexagon_LD_PLT_B32_PCREL_X:306 return ELF::R_HEX_LD_PLT_B32_PCREL_X;307 }308}309 310std::unique_ptr<MCObjectTargetWriter>311llvm::createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU) {312 return std::make_unique<HexagonELFObjectWriter>(OSABI, CPU);313}314