Home | History | Annotate | Download | only in MCTargetDesc
      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   switch ((unsigned)Fixup.getKind()) {
     45   default:
     46     DEBUG(dbgs() << "unrecognized relocation " << Fixup.getKind() << "\n");
     47     llvm_unreachable("Unimplemented Fixup kind!");
     48     return ELF::R_HEX_NONE;
     49   case FK_Data_4:
     50     return (IsPCRel) ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
     51   case FK_PCRel_4:
     52     return ELF::R_HEX_32_PCREL;
     53   case FK_Data_2:
     54     return ELF::R_HEX_16;
     55   case FK_Data_1:
     56     return ELF::R_HEX_8;
     57   case fixup_Hexagon_B22_PCREL:
     58     return ELF::R_HEX_B22_PCREL;
     59   case fixup_Hexagon_B15_PCREL:
     60     return ELF::R_HEX_B15_PCREL;
     61   case fixup_Hexagon_B7_PCREL:
     62     return ELF::R_HEX_B7_PCREL;
     63   case fixup_Hexagon_LO16:
     64     return ELF::R_HEX_LO16;
     65   case fixup_Hexagon_HI16:
     66     return ELF::R_HEX_HI16;
     67   case fixup_Hexagon_32:
     68     return ELF::R_HEX_32;
     69   case fixup_Hexagon_16:
     70     return ELF::R_HEX_16;
     71   case fixup_Hexagon_8:
     72     return ELF::R_HEX_8;
     73   case fixup_Hexagon_GPREL16_0:
     74     return ELF::R_HEX_GPREL16_0;
     75   case fixup_Hexagon_GPREL16_1:
     76     return ELF::R_HEX_GPREL16_1;
     77   case fixup_Hexagon_GPREL16_2:
     78     return ELF::R_HEX_GPREL16_2;
     79   case fixup_Hexagon_GPREL16_3:
     80     return ELF::R_HEX_GPREL16_3;
     81   case fixup_Hexagon_HL16:
     82     return ELF::R_HEX_HL16;
     83   case fixup_Hexagon_B13_PCREL:
     84     return ELF::R_HEX_B13_PCREL;
     85   case fixup_Hexagon_B9_PCREL:
     86     return ELF::R_HEX_B9_PCREL;
     87   case fixup_Hexagon_B32_PCREL_X:
     88     return ELF::R_HEX_B32_PCREL_X;
     89   case fixup_Hexagon_32_6_X:
     90     return ELF::R_HEX_32_6_X;
     91   case fixup_Hexagon_B22_PCREL_X:
     92     return ELF::R_HEX_B22_PCREL_X;
     93   case fixup_Hexagon_B15_PCREL_X:
     94     return ELF::R_HEX_B15_PCREL_X;
     95   case fixup_Hexagon_B13_PCREL_X:
     96     return ELF::R_HEX_B13_PCREL_X;
     97   case fixup_Hexagon_B9_PCREL_X:
     98     return ELF::R_HEX_B9_PCREL_X;
     99   case fixup_Hexagon_B7_PCREL_X:
    100     return ELF::R_HEX_B7_PCREL_X;
    101   case fixup_Hexagon_16_X:
    102     return ELF::R_HEX_16_X;
    103   case fixup_Hexagon_12_X:
    104     return ELF::R_HEX_12_X;
    105   case fixup_Hexagon_11_X:
    106     return ELF::R_HEX_11_X;
    107   case fixup_Hexagon_10_X:
    108     return ELF::R_HEX_10_X;
    109   case fixup_Hexagon_9_X:
    110     return ELF::R_HEX_9_X;
    111   case fixup_Hexagon_8_X:
    112     return ELF::R_HEX_8_X;
    113   case fixup_Hexagon_7_X:
    114     return ELF::R_HEX_7_X;
    115   case fixup_Hexagon_6_X:
    116     return ELF::R_HEX_6_X;
    117   case fixup_Hexagon_32_PCREL:
    118     return ELF::R_HEX_32_PCREL;
    119   case fixup_Hexagon_COPY:
    120     return ELF::R_HEX_COPY;
    121   case fixup_Hexagon_GLOB_DAT:
    122     return ELF::R_HEX_GLOB_DAT;
    123   case fixup_Hexagon_JMP_SLOT:
    124     return ELF::R_HEX_JMP_SLOT;
    125   case fixup_Hexagon_RELATIVE:
    126     return ELF::R_HEX_RELATIVE;
    127   case fixup_Hexagon_PLT_B22_PCREL:
    128     return ELF::R_HEX_PLT_B22_PCREL;
    129   case fixup_Hexagon_GOTREL_LO16:
    130     return ELF::R_HEX_GOTREL_LO16;
    131   case fixup_Hexagon_GOTREL_HI16:
    132     return ELF::R_HEX_GOTREL_HI16;
    133   case fixup_Hexagon_GOTREL_32:
    134     return ELF::R_HEX_GOTREL_32;
    135   case fixup_Hexagon_GOT_LO16:
    136     return ELF::R_HEX_GOT_LO16;
    137   case fixup_Hexagon_GOT_HI16:
    138     return ELF::R_HEX_GOT_HI16;
    139   case fixup_Hexagon_GOT_32:
    140     return ELF::R_HEX_GOT_32;
    141   case fixup_Hexagon_GOT_16:
    142     return ELF::R_HEX_GOT_16;
    143   case fixup_Hexagon_DTPMOD_32:
    144     return ELF::R_HEX_DTPMOD_32;
    145   case fixup_Hexagon_DTPREL_LO16:
    146     return ELF::R_HEX_DTPREL_LO16;
    147   case fixup_Hexagon_DTPREL_HI16:
    148     return ELF::R_HEX_DTPREL_HI16;
    149   case fixup_Hexagon_DTPREL_32:
    150     return ELF::R_HEX_DTPREL_32;
    151   case fixup_Hexagon_DTPREL_16:
    152     return ELF::R_HEX_DTPREL_16;
    153   case fixup_Hexagon_GD_PLT_B22_PCREL:
    154     return ELF::R_HEX_GD_PLT_B22_PCREL;
    155   case fixup_Hexagon_LD_PLT_B22_PCREL:
    156     return ELF::R_HEX_LD_PLT_B22_PCREL;
    157   case fixup_Hexagon_GD_GOT_LO16:
    158     return ELF::R_HEX_GD_GOT_LO16;
    159   case fixup_Hexagon_GD_GOT_HI16:
    160     return ELF::R_HEX_GD_GOT_HI16;
    161   case fixup_Hexagon_GD_GOT_32:
    162     return ELF::R_HEX_GD_GOT_32;
    163   case fixup_Hexagon_GD_GOT_16:
    164     return ELF::R_HEX_GD_GOT_16;
    165   case fixup_Hexagon_LD_GOT_LO16:
    166     return ELF::R_HEX_LD_GOT_LO16;
    167   case fixup_Hexagon_LD_GOT_HI16:
    168     return ELF::R_HEX_LD_GOT_HI16;
    169   case fixup_Hexagon_LD_GOT_32:
    170     return ELF::R_HEX_LD_GOT_32;
    171   case fixup_Hexagon_LD_GOT_16:
    172     return ELF::R_HEX_LD_GOT_16;
    173   case fixup_Hexagon_IE_LO16:
    174     return ELF::R_HEX_IE_LO16;
    175   case fixup_Hexagon_IE_HI16:
    176     return ELF::R_HEX_IE_HI16;
    177   case fixup_Hexagon_IE_32:
    178     return ELF::R_HEX_IE_32;
    179   case fixup_Hexagon_IE_GOT_LO16:
    180     return ELF::R_HEX_IE_GOT_LO16;
    181   case fixup_Hexagon_IE_GOT_HI16:
    182     return ELF::R_HEX_IE_GOT_HI16;
    183   case fixup_Hexagon_IE_GOT_32:
    184     return ELF::R_HEX_IE_GOT_32;
    185   case fixup_Hexagon_IE_GOT_16:
    186     return ELF::R_HEX_IE_GOT_16;
    187   case fixup_Hexagon_TPREL_LO16:
    188     return ELF::R_HEX_TPREL_LO16;
    189   case fixup_Hexagon_TPREL_HI16:
    190     return ELF::R_HEX_TPREL_HI16;
    191   case fixup_Hexagon_TPREL_32:
    192     return ELF::R_HEX_TPREL_32;
    193   case fixup_Hexagon_TPREL_16:
    194     return ELF::R_HEX_TPREL_16;
    195   case fixup_Hexagon_6_PCREL_X:
    196     return ELF::R_HEX_6_PCREL_X;
    197   case fixup_Hexagon_GOTREL_32_6_X:
    198     return ELF::R_HEX_GOTREL_32_6_X;
    199   case fixup_Hexagon_GOTREL_16_X:
    200     return ELF::R_HEX_GOTREL_16_X;
    201   case fixup_Hexagon_GOTREL_11_X:
    202     return ELF::R_HEX_GOTREL_11_X;
    203   case fixup_Hexagon_GOT_32_6_X:
    204     return ELF::R_HEX_GOT_32_6_X;
    205   case fixup_Hexagon_GOT_16_X:
    206     return ELF::R_HEX_GOT_16_X;
    207   case fixup_Hexagon_GOT_11_X:
    208     return ELF::R_HEX_GOT_11_X;
    209   case fixup_Hexagon_DTPREL_32_6_X:
    210     return ELF::R_HEX_DTPREL_32_6_X;
    211   case fixup_Hexagon_DTPREL_16_X:
    212     return ELF::R_HEX_DTPREL_16_X;
    213   case fixup_Hexagon_DTPREL_11_X:
    214     return ELF::R_HEX_DTPREL_11_X;
    215   case fixup_Hexagon_GD_GOT_32_6_X:
    216     return ELF::R_HEX_GD_GOT_32_6_X;
    217   case fixup_Hexagon_GD_GOT_16_X:
    218     return ELF::R_HEX_GD_GOT_16_X;
    219   case fixup_Hexagon_GD_GOT_11_X:
    220     return ELF::R_HEX_GD_GOT_11_X;
    221   case fixup_Hexagon_LD_GOT_32_6_X:
    222     return ELF::R_HEX_LD_GOT_32_6_X;
    223   case fixup_Hexagon_LD_GOT_16_X:
    224     return ELF::R_HEX_LD_GOT_16_X;
    225   case fixup_Hexagon_LD_GOT_11_X:
    226     return ELF::R_HEX_LD_GOT_11_X;
    227   case fixup_Hexagon_IE_32_6_X:
    228     return ELF::R_HEX_IE_32_6_X;
    229   case fixup_Hexagon_IE_16_X:
    230     return ELF::R_HEX_IE_16_X;
    231   case fixup_Hexagon_IE_GOT_32_6_X:
    232     return ELF::R_HEX_IE_GOT_32_6_X;
    233   case fixup_Hexagon_IE_GOT_16_X:
    234     return ELF::R_HEX_IE_GOT_16_X;
    235   case fixup_Hexagon_IE_GOT_11_X:
    236     return ELF::R_HEX_IE_GOT_11_X;
    237   case fixup_Hexagon_TPREL_32_6_X:
    238     return ELF::R_HEX_TPREL_32_6_X;
    239   case fixup_Hexagon_TPREL_16_X:
    240     return ELF::R_HEX_TPREL_16_X;
    241   case fixup_Hexagon_TPREL_11_X:
    242     return ELF::R_HEX_TPREL_11_X;
    243   }
    244 }
    245 
    246 MCObjectWriter *llvm::createHexagonELFObjectWriter(raw_pwrite_stream &OS,
    247                                                    uint8_t OSABI,
    248                                                    StringRef CPU) {
    249   MCELFObjectTargetWriter *MOTW = new HexagonELFObjectWriter(OSABI, CPU);
    250   return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true);
    251 }
    252