17330f729Sjoerg //===-- HexagonELFObjectWriter.cpp - Hexagon Target Descriptions ----------===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg
97330f729Sjoerg #include "MCTargetDesc/HexagonFixupKinds.h"
107330f729Sjoerg #include "MCTargetDesc/HexagonMCTargetDesc.h"
117330f729Sjoerg #include "llvm/MC/MCAssembler.h"
127330f729Sjoerg #include "llvm/MC/MCELFObjectWriter.h"
137330f729Sjoerg #include "llvm/MC/MCObjectWriter.h"
147330f729Sjoerg #include "llvm/MC/MCValue.h"
157330f729Sjoerg #include "llvm/Support/Debug.h"
167330f729Sjoerg #include "llvm/Support/raw_ostream.h"
177330f729Sjoerg
187330f729Sjoerg #define DEBUG_TYPE "hexagon-elf-writer"
197330f729Sjoerg
207330f729Sjoerg using namespace llvm;
217330f729Sjoerg using namespace Hexagon;
227330f729Sjoerg
237330f729Sjoerg namespace {
247330f729Sjoerg
257330f729Sjoerg class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
267330f729Sjoerg private:
277330f729Sjoerg StringRef CPU;
287330f729Sjoerg
297330f729Sjoerg public:
307330f729Sjoerg HexagonELFObjectWriter(uint8_t OSABI, StringRef C);
317330f729Sjoerg
327330f729Sjoerg unsigned getRelocType(MCContext &Ctx, MCValue const &Target,
337330f729Sjoerg MCFixup const &Fixup, bool IsPCRel) const override;
347330f729Sjoerg };
357330f729Sjoerg }
367330f729Sjoerg
HexagonELFObjectWriter(uint8_t OSABI,StringRef C)377330f729Sjoerg HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
387330f729Sjoerg : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
397330f729Sjoerg /*HasRelocationAddend*/ true),
407330f729Sjoerg CPU(C) {}
417330f729Sjoerg
getRelocType(MCContext & Ctx,MCValue const & Target,MCFixup const & Fixup,bool IsPCRel) const427330f729Sjoerg unsigned HexagonELFObjectWriter::getRelocType(MCContext &Ctx,
437330f729Sjoerg MCValue const &Target,
447330f729Sjoerg MCFixup const &Fixup,
457330f729Sjoerg bool IsPCRel) const {
467330f729Sjoerg MCSymbolRefExpr::VariantKind Variant = Target.getAccessVariant();
477330f729Sjoerg switch (Fixup.getTargetKind()) {
487330f729Sjoerg default:
497330f729Sjoerg report_fatal_error("Unrecognized relocation type");
507330f729Sjoerg break;
517330f729Sjoerg case FK_Data_4:
527330f729Sjoerg switch(Variant) {
537330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_DTPREL:
547330f729Sjoerg return ELF::R_HEX_DTPREL_32;
557330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_GOT:
567330f729Sjoerg return ELF::R_HEX_GOT_32;
577330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_GOTREL:
587330f729Sjoerg return ELF::R_HEX_GOTREL_32;
597330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_GD_GOT:
607330f729Sjoerg return ELF::R_HEX_GD_GOT_32;
617330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE:
627330f729Sjoerg return ELF::R_HEX_IE_32;
637330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE_GOT:
647330f729Sjoerg return ELF::R_HEX_IE_GOT_32;
657330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_LD_GOT:
667330f729Sjoerg return ELF::R_HEX_LD_GOT_32;
67*82d56013Sjoerg case MCSymbolRefExpr::VariantKind::VK_PCREL:
687330f729Sjoerg return ELF::R_HEX_32_PCREL;
697330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_TPREL:
707330f729Sjoerg return ELF::R_HEX_TPREL_32;
717330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_None:
727330f729Sjoerg return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
737330f729Sjoerg default:
747330f729Sjoerg report_fatal_error("Unrecognized variant type");
757330f729Sjoerg };
767330f729Sjoerg case FK_PCRel_4:
777330f729Sjoerg return ELF::R_HEX_32_PCREL;
787330f729Sjoerg case FK_Data_2:
797330f729Sjoerg switch(Variant) {
807330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_DTPREL:
817330f729Sjoerg return ELF::R_HEX_DTPREL_16;
827330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_GOT:
837330f729Sjoerg return ELF::R_HEX_GOT_16;
847330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_GD_GOT:
857330f729Sjoerg return ELF::R_HEX_GD_GOT_16;
867330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE_GOT:
877330f729Sjoerg return ELF::R_HEX_IE_GOT_16;
887330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_Hexagon_LD_GOT:
897330f729Sjoerg return ELF::R_HEX_LD_GOT_16;
907330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_TPREL:
917330f729Sjoerg return ELF::R_HEX_TPREL_16;
927330f729Sjoerg case MCSymbolRefExpr::VariantKind::VK_None:
937330f729Sjoerg return ELF::R_HEX_16;
947330f729Sjoerg default:
957330f729Sjoerg report_fatal_error("Unrecognized variant type");
967330f729Sjoerg };
977330f729Sjoerg case FK_Data_1:
987330f729Sjoerg return ELF::R_HEX_8;
997330f729Sjoerg case fixup_Hexagon_B22_PCREL:
1007330f729Sjoerg return ELF::R_HEX_B22_PCREL;
1017330f729Sjoerg case fixup_Hexagon_B15_PCREL:
1027330f729Sjoerg return ELF::R_HEX_B15_PCREL;
1037330f729Sjoerg case fixup_Hexagon_B7_PCREL:
1047330f729Sjoerg return ELF::R_HEX_B7_PCREL;
1057330f729Sjoerg case fixup_Hexagon_LO16:
1067330f729Sjoerg return ELF::R_HEX_LO16;
1077330f729Sjoerg case fixup_Hexagon_HI16:
1087330f729Sjoerg return ELF::R_HEX_HI16;
1097330f729Sjoerg case fixup_Hexagon_32:
1107330f729Sjoerg return ELF::R_HEX_32;
1117330f729Sjoerg case fixup_Hexagon_16:
1127330f729Sjoerg return ELF::R_HEX_16;
1137330f729Sjoerg case fixup_Hexagon_8:
1147330f729Sjoerg return ELF::R_HEX_8;
1157330f729Sjoerg case fixup_Hexagon_GPREL16_0:
1167330f729Sjoerg return ELF::R_HEX_GPREL16_0;
1177330f729Sjoerg case fixup_Hexagon_GPREL16_1:
1187330f729Sjoerg return ELF::R_HEX_GPREL16_1;
1197330f729Sjoerg case fixup_Hexagon_GPREL16_2:
1207330f729Sjoerg return ELF::R_HEX_GPREL16_2;
1217330f729Sjoerg case fixup_Hexagon_GPREL16_3:
1227330f729Sjoerg return ELF::R_HEX_GPREL16_3;
1237330f729Sjoerg case fixup_Hexagon_HL16:
1247330f729Sjoerg return ELF::R_HEX_HL16;
1257330f729Sjoerg case fixup_Hexagon_B13_PCREL:
1267330f729Sjoerg return ELF::R_HEX_B13_PCREL;
1277330f729Sjoerg case fixup_Hexagon_B9_PCREL:
1287330f729Sjoerg return ELF::R_HEX_B9_PCREL;
1297330f729Sjoerg case fixup_Hexagon_B32_PCREL_X:
1307330f729Sjoerg return ELF::R_HEX_B32_PCREL_X;
1317330f729Sjoerg case fixup_Hexagon_32_6_X:
1327330f729Sjoerg return ELF::R_HEX_32_6_X;
1337330f729Sjoerg case fixup_Hexagon_B22_PCREL_X:
1347330f729Sjoerg return ELF::R_HEX_B22_PCREL_X;
1357330f729Sjoerg case fixup_Hexagon_B15_PCREL_X:
1367330f729Sjoerg return ELF::R_HEX_B15_PCREL_X;
1377330f729Sjoerg case fixup_Hexagon_B13_PCREL_X:
1387330f729Sjoerg return ELF::R_HEX_B13_PCREL_X;
1397330f729Sjoerg case fixup_Hexagon_B9_PCREL_X:
1407330f729Sjoerg return ELF::R_HEX_B9_PCREL_X;
1417330f729Sjoerg case fixup_Hexagon_B7_PCREL_X:
1427330f729Sjoerg return ELF::R_HEX_B7_PCREL_X;
1437330f729Sjoerg case fixup_Hexagon_16_X:
1447330f729Sjoerg return ELF::R_HEX_16_X;
1457330f729Sjoerg case fixup_Hexagon_12_X:
1467330f729Sjoerg return ELF::R_HEX_12_X;
1477330f729Sjoerg case fixup_Hexagon_11_X:
1487330f729Sjoerg return ELF::R_HEX_11_X;
1497330f729Sjoerg case fixup_Hexagon_10_X:
1507330f729Sjoerg return ELF::R_HEX_10_X;
1517330f729Sjoerg case fixup_Hexagon_9_X:
1527330f729Sjoerg return ELF::R_HEX_9_X;
1537330f729Sjoerg case fixup_Hexagon_8_X:
1547330f729Sjoerg return ELF::R_HEX_8_X;
1557330f729Sjoerg case fixup_Hexagon_7_X:
1567330f729Sjoerg return ELF::R_HEX_7_X;
1577330f729Sjoerg case fixup_Hexagon_6_X:
1587330f729Sjoerg return ELF::R_HEX_6_X;
1597330f729Sjoerg case fixup_Hexagon_32_PCREL:
1607330f729Sjoerg return ELF::R_HEX_32_PCREL;
1617330f729Sjoerg case fixup_Hexagon_COPY:
1627330f729Sjoerg return ELF::R_HEX_COPY;
1637330f729Sjoerg case fixup_Hexagon_GLOB_DAT:
1647330f729Sjoerg return ELF::R_HEX_GLOB_DAT;
1657330f729Sjoerg case fixup_Hexagon_JMP_SLOT:
1667330f729Sjoerg return ELF::R_HEX_JMP_SLOT;
1677330f729Sjoerg case fixup_Hexagon_RELATIVE:
1687330f729Sjoerg return ELF::R_HEX_RELATIVE;
1697330f729Sjoerg case fixup_Hexagon_PLT_B22_PCREL:
1707330f729Sjoerg return ELF::R_HEX_PLT_B22_PCREL;
1717330f729Sjoerg case fixup_Hexagon_GOTREL_LO16:
1727330f729Sjoerg return ELF::R_HEX_GOTREL_LO16;
1737330f729Sjoerg case fixup_Hexagon_GOTREL_HI16:
1747330f729Sjoerg return ELF::R_HEX_GOTREL_HI16;
1757330f729Sjoerg case fixup_Hexagon_GOTREL_32:
1767330f729Sjoerg return ELF::R_HEX_GOTREL_32;
1777330f729Sjoerg case fixup_Hexagon_GOT_LO16:
1787330f729Sjoerg return ELF::R_HEX_GOT_LO16;
1797330f729Sjoerg case fixup_Hexagon_GOT_HI16:
1807330f729Sjoerg return ELF::R_HEX_GOT_HI16;
1817330f729Sjoerg case fixup_Hexagon_GOT_32:
1827330f729Sjoerg return ELF::R_HEX_GOT_32;
1837330f729Sjoerg case fixup_Hexagon_GOT_16:
1847330f729Sjoerg return ELF::R_HEX_GOT_16;
1857330f729Sjoerg case fixup_Hexagon_DTPMOD_32:
1867330f729Sjoerg return ELF::R_HEX_DTPMOD_32;
1877330f729Sjoerg case fixup_Hexagon_DTPREL_LO16:
1887330f729Sjoerg return ELF::R_HEX_DTPREL_LO16;
1897330f729Sjoerg case fixup_Hexagon_DTPREL_HI16:
1907330f729Sjoerg return ELF::R_HEX_DTPREL_HI16;
1917330f729Sjoerg case fixup_Hexagon_DTPREL_32:
1927330f729Sjoerg return ELF::R_HEX_DTPREL_32;
1937330f729Sjoerg case fixup_Hexagon_DTPREL_16:
1947330f729Sjoerg return ELF::R_HEX_DTPREL_16;
1957330f729Sjoerg case fixup_Hexagon_GD_PLT_B22_PCREL:
1967330f729Sjoerg return ELF::R_HEX_GD_PLT_B22_PCREL;
1977330f729Sjoerg case fixup_Hexagon_LD_PLT_B22_PCREL:
1987330f729Sjoerg return ELF::R_HEX_LD_PLT_B22_PCREL;
1997330f729Sjoerg case fixup_Hexagon_GD_GOT_LO16:
2007330f729Sjoerg return ELF::R_HEX_GD_GOT_LO16;
2017330f729Sjoerg case fixup_Hexagon_GD_GOT_HI16:
2027330f729Sjoerg return ELF::R_HEX_GD_GOT_HI16;
2037330f729Sjoerg case fixup_Hexagon_GD_GOT_32:
2047330f729Sjoerg return ELF::R_HEX_GD_GOT_32;
2057330f729Sjoerg case fixup_Hexagon_GD_GOT_16:
2067330f729Sjoerg return ELF::R_HEX_GD_GOT_16;
2077330f729Sjoerg case fixup_Hexagon_LD_GOT_LO16:
2087330f729Sjoerg return ELF::R_HEX_LD_GOT_LO16;
2097330f729Sjoerg case fixup_Hexagon_LD_GOT_HI16:
2107330f729Sjoerg return ELF::R_HEX_LD_GOT_HI16;
2117330f729Sjoerg case fixup_Hexagon_LD_GOT_32:
2127330f729Sjoerg return ELF::R_HEX_LD_GOT_32;
2137330f729Sjoerg case fixup_Hexagon_LD_GOT_16:
2147330f729Sjoerg return ELF::R_HEX_LD_GOT_16;
2157330f729Sjoerg case fixup_Hexagon_IE_LO16:
2167330f729Sjoerg return ELF::R_HEX_IE_LO16;
2177330f729Sjoerg case fixup_Hexagon_IE_HI16:
2187330f729Sjoerg return ELF::R_HEX_IE_HI16;
2197330f729Sjoerg case fixup_Hexagon_IE_32:
2207330f729Sjoerg return ELF::R_HEX_IE_32;
2217330f729Sjoerg case fixup_Hexagon_IE_GOT_LO16:
2227330f729Sjoerg return ELF::R_HEX_IE_GOT_LO16;
2237330f729Sjoerg case fixup_Hexagon_IE_GOT_HI16:
2247330f729Sjoerg return ELF::R_HEX_IE_GOT_HI16;
2257330f729Sjoerg case fixup_Hexagon_IE_GOT_32:
2267330f729Sjoerg return ELF::R_HEX_IE_GOT_32;
2277330f729Sjoerg case fixup_Hexagon_IE_GOT_16:
2287330f729Sjoerg return ELF::R_HEX_IE_GOT_16;
2297330f729Sjoerg case fixup_Hexagon_TPREL_LO16:
2307330f729Sjoerg return ELF::R_HEX_TPREL_LO16;
2317330f729Sjoerg case fixup_Hexagon_TPREL_HI16:
2327330f729Sjoerg return ELF::R_HEX_TPREL_HI16;
2337330f729Sjoerg case fixup_Hexagon_TPREL_32:
2347330f729Sjoerg return ELF::R_HEX_TPREL_32;
2357330f729Sjoerg case fixup_Hexagon_TPREL_16:
2367330f729Sjoerg return ELF::R_HEX_TPREL_16;
2377330f729Sjoerg case fixup_Hexagon_6_PCREL_X:
2387330f729Sjoerg return ELF::R_HEX_6_PCREL_X;
2397330f729Sjoerg case fixup_Hexagon_GOTREL_32_6_X:
2407330f729Sjoerg return ELF::R_HEX_GOTREL_32_6_X;
2417330f729Sjoerg case fixup_Hexagon_GOTREL_16_X:
2427330f729Sjoerg return ELF::R_HEX_GOTREL_16_X;
2437330f729Sjoerg case fixup_Hexagon_GOTREL_11_X:
2447330f729Sjoerg return ELF::R_HEX_GOTREL_11_X;
2457330f729Sjoerg case fixup_Hexagon_GOT_32_6_X:
2467330f729Sjoerg return ELF::R_HEX_GOT_32_6_X;
2477330f729Sjoerg case fixup_Hexagon_GOT_16_X:
2487330f729Sjoerg return ELF::R_HEX_GOT_16_X;
2497330f729Sjoerg case fixup_Hexagon_GOT_11_X:
2507330f729Sjoerg return ELF::R_HEX_GOT_11_X;
2517330f729Sjoerg case fixup_Hexagon_DTPREL_32_6_X:
2527330f729Sjoerg return ELF::R_HEX_DTPREL_32_6_X;
2537330f729Sjoerg case fixup_Hexagon_DTPREL_16_X:
2547330f729Sjoerg return ELF::R_HEX_DTPREL_16_X;
2557330f729Sjoerg case fixup_Hexagon_DTPREL_11_X:
2567330f729Sjoerg return ELF::R_HEX_DTPREL_11_X;
2577330f729Sjoerg case fixup_Hexagon_GD_GOT_32_6_X:
2587330f729Sjoerg return ELF::R_HEX_GD_GOT_32_6_X;
2597330f729Sjoerg case fixup_Hexagon_GD_GOT_16_X:
2607330f729Sjoerg return ELF::R_HEX_GD_GOT_16_X;
2617330f729Sjoerg case fixup_Hexagon_GD_GOT_11_X:
2627330f729Sjoerg return ELF::R_HEX_GD_GOT_11_X;
2637330f729Sjoerg case fixup_Hexagon_LD_GOT_32_6_X:
2647330f729Sjoerg return ELF::R_HEX_LD_GOT_32_6_X;
2657330f729Sjoerg case fixup_Hexagon_LD_GOT_16_X:
2667330f729Sjoerg return ELF::R_HEX_LD_GOT_16_X;
2677330f729Sjoerg case fixup_Hexagon_LD_GOT_11_X:
2687330f729Sjoerg return ELF::R_HEX_LD_GOT_11_X;
2697330f729Sjoerg case fixup_Hexagon_IE_32_6_X:
2707330f729Sjoerg return ELF::R_HEX_IE_32_6_X;
2717330f729Sjoerg case fixup_Hexagon_IE_16_X:
2727330f729Sjoerg return ELF::R_HEX_IE_16_X;
2737330f729Sjoerg case fixup_Hexagon_IE_GOT_32_6_X:
2747330f729Sjoerg return ELF::R_HEX_IE_GOT_32_6_X;
2757330f729Sjoerg case fixup_Hexagon_IE_GOT_16_X:
2767330f729Sjoerg return ELF::R_HEX_IE_GOT_16_X;
2777330f729Sjoerg case fixup_Hexagon_IE_GOT_11_X:
2787330f729Sjoerg return ELF::R_HEX_IE_GOT_11_X;
2797330f729Sjoerg case fixup_Hexagon_TPREL_32_6_X:
2807330f729Sjoerg return ELF::R_HEX_TPREL_32_6_X;
2817330f729Sjoerg case fixup_Hexagon_TPREL_16_X:
2827330f729Sjoerg return ELF::R_HEX_TPREL_16_X;
2837330f729Sjoerg case fixup_Hexagon_TPREL_11_X:
2847330f729Sjoerg return ELF::R_HEX_TPREL_11_X;
2857330f729Sjoerg case fixup_Hexagon_23_REG:
2867330f729Sjoerg return ELF::R_HEX_23_REG;
2877330f729Sjoerg case fixup_Hexagon_27_REG:
2887330f729Sjoerg return ELF::R_HEX_27_REG;
2897330f729Sjoerg case fixup_Hexagon_GD_PLT_B22_PCREL_X:
2907330f729Sjoerg return ELF::R_HEX_GD_PLT_B22_PCREL_X;
2917330f729Sjoerg case fixup_Hexagon_GD_PLT_B32_PCREL_X:
2927330f729Sjoerg return ELF::R_HEX_GD_PLT_B32_PCREL_X;
2937330f729Sjoerg case fixup_Hexagon_LD_PLT_B22_PCREL_X:
2947330f729Sjoerg return ELF::R_HEX_LD_PLT_B22_PCREL_X;
2957330f729Sjoerg case fixup_Hexagon_LD_PLT_B32_PCREL_X:
2967330f729Sjoerg return ELF::R_HEX_LD_PLT_B32_PCREL_X;
2977330f729Sjoerg }
2987330f729Sjoerg }
2997330f729Sjoerg
3007330f729Sjoerg std::unique_ptr<MCObjectTargetWriter>
createHexagonELFObjectWriter(uint8_t OSABI,StringRef CPU)3017330f729Sjoerg llvm::createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU) {
3027330f729Sjoerg return std::make_unique<HexagonELFObjectWriter>(OSABI, CPU);
3037330f729Sjoerg }
304