brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · af97ea2 Raw
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