static MCSymbolRefExpr::VariantKind getAccessVariant(const MCValue &Target, const MCFixup &Fixup) { const MCExpr *Expr = Fixup.getValue(); if (Expr->getKind() != MCExpr::Target) return Target.getAccessVariant(); switch (cast<PPCMCExpr>(Expr)->getKind()) { case PPCMCExpr::VK_PPC_None: return MCSymbolRefExpr::VK_None; case PPCMCExpr::VK_PPC_LO: return MCSymbolRefExpr::VK_PPC_LO; case PPCMCExpr::VK_PPC_HI: return MCSymbolRefExpr::VK_PPC_HI; case PPCMCExpr::VK_PPC_HA: return MCSymbolRefExpr::VK_PPC_HA; case PPCMCExpr::VK_PPC_HIGHERA: return MCSymbolRefExpr::VK_PPC_HIGHERA; case PPCMCExpr::VK_PPC_HIGHER: return MCSymbolRefExpr::VK_PPC_HIGHER; case PPCMCExpr::VK_PPC_HIGHEST: return MCSymbolRefExpr::VK_PPC_HIGHEST; case PPCMCExpr::VK_PPC_HIGHESTA: return MCSymbolRefExpr::VK_PPC_HIGHESTA; } llvm_unreachable("unknown PPCMCExpr kind"); }
unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); X86_64RelType Type = getType64(Fixup.getKind(), Modifier, IsPCRel); if (getEMachine() == ELF::EM_X86_64) return getRelocType64(Modifier, Type, IsPCRel); assert(getEMachine() == ELF::EM_386 && "Unsupported ELF machine type."); return getRelocType32(Modifier, getType32(Type), IsPCRel); }
unsigned SystemZObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); unsigned Kind = Fixup.getKind(); switch (Modifier) { case MCSymbolRefExpr::VK_None: if (IsPCRel) return getPCRelReloc(Kind); return getAbsoluteReloc(Kind); case MCSymbolRefExpr::VK_NTPOFF: assert(!IsPCRel && "NTPOFF shouldn't be PC-relative"); return getTLSLEReloc(Kind); case MCSymbolRefExpr::VK_INDNTPOFF: if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL) return ELF::R_390_TLS_IEENT; llvm_unreachable("Only PC-relative INDNTPOFF accesses are supported for now"); case MCSymbolRefExpr::VK_DTPOFF: assert(!IsPCRel && "DTPOFF shouldn't be PC-relative"); return getTLSLDOReloc(Kind); case MCSymbolRefExpr::VK_TLSLDM: assert(!IsPCRel && "TLSLDM shouldn't be PC-relative"); return getTLSLDMReloc(Kind); case MCSymbolRefExpr::VK_TLSGD: assert(!IsPCRel && "TLSGD shouldn't be PC-relative"); return getTLSGDReloc(Kind); case MCSymbolRefExpr::VK_GOT: if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL) return ELF::R_390_GOTENT; llvm_unreachable("Only PC-relative GOT accesses are supported for now"); case MCSymbolRefExpr::VK_PLT: assert(IsPCRel && "@PLT shouldt be PC-relative"); return getPLTReloc(Kind); default: llvm_unreachable("Modifier not supported"); } }
unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); unsigned Type = 0; if (IsPCRel) { switch ((unsigned)Fixup.getKind()) { default: report_fatal_error("unsupported relocation on symbol"); return ELF::R_ARM_NONE; case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: Type = ELF::R_ARM_REL32; break; case MCSymbolRefExpr::VK_TLSGD: llvm_unreachable("unimplemented"); case MCSymbolRefExpr::VK_GOTTPOFF: Type = ELF::R_ARM_TLS_IE32; break; case MCSymbolRefExpr::VK_ARM_GOT_PREL: Type = ELF::R_ARM_GOT_PREL; break; case MCSymbolRefExpr::VK_ARM_PREL31: Type = ELF::R_ARM_PREL31; break; } break; case ARM::fixup_arm_blx: case ARM::fixup_arm_uncondbl: switch (Modifier) { case MCSymbolRefExpr::VK_PLT: Type = ELF::R_ARM_CALL; break; case MCSymbolRefExpr::VK_TLSCALL: Type = ELF::R_ARM_TLS_CALL; break; default: Type = ELF::R_ARM_CALL; break; } break; case ARM::fixup_arm_condbl: case ARM::fixup_arm_condbranch: case ARM::fixup_arm_uncondbranch: Type = ELF::R_ARM_JUMP24; break; case ARM::fixup_t2_condbranch: Type = ELF::R_ARM_THM_JUMP19; break; case ARM::fixup_t2_uncondbranch: Type = ELF::R_ARM_THM_JUMP24; break; case ARM::fixup_arm_movt_hi16: Type = ELF::R_ARM_MOVT_PREL; break; case ARM::fixup_arm_movw_lo16: Type = ELF::R_ARM_MOVW_PREL_NC; break; case ARM::fixup_t2_movt_hi16: Type = ELF::R_ARM_THM_MOVT_PREL; break; case ARM::fixup_t2_movw_lo16: Type = ELF::R_ARM_THM_MOVW_PREL_NC; break; case ARM::fixup_arm_thumb_bl: case ARM::fixup_arm_thumb_blx: switch (Modifier) { case MCSymbolRefExpr::VK_TLSCALL: Type = ELF::R_ARM_THM_TLS_CALL; break; default: Type = ELF::R_ARM_THM_CALL; break; } break; } } else { switch ((unsigned)Fixup.getKind()) { default: report_fatal_error("unsupported relocation on symbol"); return ELF::R_ARM_NONE; case FK_Data_1: switch (Modifier) { default: llvm_unreachable("unsupported Modifier"); case MCSymbolRefExpr::VK_None: Type = ELF::R_ARM_ABS8; break; } break; case FK_Data_2: switch (Modifier) { default: llvm_unreachable("unsupported modifier"); case MCSymbolRefExpr::VK_None: Type = ELF::R_ARM_ABS16; break; } break; case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_ARM_NONE: Type = ELF::R_ARM_NONE; break; case MCSymbolRefExpr::VK_GOT: Type = ELF::R_ARM_GOT_BREL; break; case MCSymbolRefExpr::VK_TLSGD: Type = ELF::R_ARM_TLS_GD32; break; case MCSymbolRefExpr::VK_TPOFF: Type = ELF::R_ARM_TLS_LE32; break; case MCSymbolRefExpr::VK_GOTTPOFF: Type = ELF::R_ARM_TLS_IE32; break; case MCSymbolRefExpr::VK_None: Type = ELF::R_ARM_ABS32; break; case MCSymbolRefExpr::VK_GOTOFF: Type = ELF::R_ARM_GOTOFF32; break; case MCSymbolRefExpr::VK_ARM_GOT_PREL: Type = ELF::R_ARM_GOT_PREL; break; case MCSymbolRefExpr::VK_ARM_TARGET1: Type = ELF::R_ARM_TARGET1; break; case MCSymbolRefExpr::VK_ARM_TARGET2: Type = ELF::R_ARM_TARGET2; break; case MCSymbolRefExpr::VK_ARM_PREL31: Type = ELF::R_ARM_PREL31; break; case MCSymbolRefExpr::VK_ARM_SBREL: Type = ELF::R_ARM_SBREL32; break; case MCSymbolRefExpr::VK_ARM_TLSLDO: Type = ELF::R_ARM_TLS_LDO32; break; case MCSymbolRefExpr::VK_TLSCALL: Type = ELF::R_ARM_TLS_CALL; break; case MCSymbolRefExpr::VK_TLSDESC: Type = ELF::R_ARM_TLS_GOTDESC; break; case MCSymbolRefExpr::VK_TLSLDM: Type = ELF::R_ARM_TLS_LDM32; break; case MCSymbolRefExpr::VK_ARM_TLSDESCSEQ: Type = ELF::R_ARM_TLS_DESCSEQ; break; } break; case ARM::fixup_arm_ldst_pcrel_12: case ARM::fixup_arm_pcrel_10: case ARM::fixup_arm_adr_pcrel_12: case ARM::fixup_arm_thumb_bl: case ARM::fixup_arm_thumb_cb: case ARM::fixup_arm_thumb_cp: case ARM::fixup_arm_thumb_br: llvm_unreachable("Unimplemented"); case ARM::fixup_arm_condbranch: case ARM::fixup_arm_uncondbranch: Type = ELF::R_ARM_JUMP24; break; case ARM::fixup_arm_movt_hi16: Type = ELF::R_ARM_MOVT_ABS; break; case ARM::fixup_arm_movw_lo16: Type = ELF::R_ARM_MOVW_ABS_NC; break; case ARM::fixup_t2_movt_hi16: Type = ELF::R_ARM_THM_MOVT_ABS; break; case ARM::fixup_t2_movw_lo16: Type = ELF::R_ARM_THM_MOVW_ABS_NC; break; } } return Type; }
unsigned AVRELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); switch ((unsigned) Fixup.getKind()) { case FK_Data_1: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_AVR_8; case MCSymbolRefExpr::VK_AVR_DIFF8: return ELF::R_AVR_DIFF8; case MCSymbolRefExpr::VK_AVR_LO8: return ELF::R_AVR_8_LO8; case MCSymbolRefExpr::VK_AVR_HI8: return ELF::R_AVR_8_HI8; case MCSymbolRefExpr::VK_AVR_HLO8: return ELF::R_AVR_8_HLO8; } case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_AVR_32; case MCSymbolRefExpr::VK_AVR_DIFF32: return ELF::R_AVR_DIFF32; } case FK_Data_2: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_AVR_16; case MCSymbolRefExpr::VK_AVR_NONE: return ELF::R_AVR_16_PM; case MCSymbolRefExpr::VK_AVR_DIFF16: return ELF::R_AVR_DIFF16; } case AVR::fixup_32: return ELF::R_AVR_32; case AVR::fixup_7_pcrel: return ELF::R_AVR_7_PCREL; case AVR::fixup_13_pcrel: return ELF::R_AVR_13_PCREL; case AVR::fixup_16: return ELF::R_AVR_16; case AVR::fixup_16_pm: return ELF::R_AVR_16_PM; case AVR::fixup_lo8_ldi: return ELF::R_AVR_LO8_LDI; case AVR::fixup_hi8_ldi: return ELF::R_AVR_HI8_LDI; case AVR::fixup_hh8_ldi: return ELF::R_AVR_HH8_LDI; case AVR::fixup_lo8_ldi_neg: return ELF::R_AVR_LO8_LDI_NEG; case AVR::fixup_hi8_ldi_neg: return ELF::R_AVR_HI8_LDI_NEG; case AVR::fixup_hh8_ldi_neg: return ELF::R_AVR_HH8_LDI_NEG; case AVR::fixup_lo8_ldi_pm: return ELF::R_AVR_LO8_LDI_PM; case AVR::fixup_hi8_ldi_pm: return ELF::R_AVR_HI8_LDI_PM; case AVR::fixup_hh8_ldi_pm: return ELF::R_AVR_HH8_LDI_PM; case AVR::fixup_lo8_ldi_pm_neg: return ELF::R_AVR_LO8_LDI_PM_NEG; case AVR::fixup_hi8_ldi_pm_neg: return ELF::R_AVR_HI8_LDI_PM_NEG; case AVR::fixup_hh8_ldi_pm_neg: return ELF::R_AVR_HH8_LDI_PM_NEG; case AVR::fixup_call: return ELF::R_AVR_CALL; case AVR::fixup_ldi: return ELF::R_AVR_LDI; case AVR::fixup_6: return ELF::R_AVR_6; case AVR::fixup_6_adiw: return ELF::R_AVR_6_ADIW; case AVR::fixup_ms8_ldi: return ELF::R_AVR_MS8_LDI; case AVR::fixup_ms8_ldi_neg: return ELF::R_AVR_MS8_LDI_NEG; case AVR::fixup_lo8_ldi_gs: return ELF::R_AVR_LO8_LDI_GS; case AVR::fixup_hi8_ldi_gs: return ELF::R_AVR_HI8_LDI_GS; case AVR::fixup_8: return ELF::R_AVR_8; case AVR::fixup_8_lo8: return ELF::R_AVR_8_LO8; case AVR::fixup_8_hi8: return ELF::R_AVR_8_HI8; case AVR::fixup_8_hlo8: return ELF::R_AVR_8_HLO8; case AVR::fixup_diff8: return ELF::R_AVR_DIFF8; case AVR::fixup_diff16: return ELF::R_AVR_DIFF16; case AVR::fixup_diff32: return ELF::R_AVR_DIFF32; case AVR::fixup_lds_sts_16: return ELF::R_AVR_LDS_STS_16; case AVR::fixup_port6: return ELF::R_AVR_PORT6; case AVR::fixup_port5: return ELF::R_AVR_PORT5; default: llvm_unreachable("invalid fixup kind!"); } }
unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel, MCContext &Ctx) const { MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); if (IsPCRel) { switch ((unsigned)Fixup.getKind()) { default: Ctx.reportFatalError(Fixup.getLoc(), "unsupported relocation on symbol"); return ELF::R_ARM_NONE; case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_REL32; case MCSymbolRefExpr::VK_GOTTPOFF: return ELF::R_ARM_TLS_IE32; case MCSymbolRefExpr::VK_ARM_GOT_PREL: return ELF::R_ARM_GOT_PREL; case MCSymbolRefExpr::VK_ARM_PREL31: return ELF::R_ARM_PREL31; } case ARM::fixup_arm_blx: case ARM::fixup_arm_uncondbl: switch (Modifier) { case MCSymbolRefExpr::VK_PLT: return ELF::R_ARM_CALL; case MCSymbolRefExpr::VK_TLSCALL: return ELF::R_ARM_TLS_CALL; default: return ELF::R_ARM_CALL; } case ARM::fixup_arm_condbl: case ARM::fixup_arm_condbranch: case ARM::fixup_arm_uncondbranch: return ELF::R_ARM_JUMP24; case ARM::fixup_t2_condbranch: return ELF::R_ARM_THM_JUMP19; case ARM::fixup_t2_uncondbranch: return ELF::R_ARM_THM_JUMP24; case ARM::fixup_arm_movt_hi16: return ELF::R_ARM_MOVT_PREL; case ARM::fixup_arm_movw_lo16: return ELF::R_ARM_MOVW_PREL_NC; case ARM::fixup_t2_movt_hi16: return ELF::R_ARM_THM_MOVT_PREL; case ARM::fixup_t2_movw_lo16: return ELF::R_ARM_THM_MOVW_PREL_NC; case ARM::fixup_arm_thumb_br: return ELF::R_ARM_THM_JUMP11; case ARM::fixup_arm_thumb_bcc: return ELF::R_ARM_THM_JUMP8; case ARM::fixup_arm_thumb_bl: case ARM::fixup_arm_thumb_blx: switch (Modifier) { case MCSymbolRefExpr::VK_TLSCALL: return ELF::R_ARM_THM_TLS_CALL; default: return ELF::R_ARM_THM_CALL; } } } switch ((unsigned)Fixup.getKind()) { default: Ctx.reportFatalError(Fixup.getLoc(), "unsupported relocation on symbol"); return ELF::R_ARM_NONE; case FK_Data_1: switch (Modifier) { default: llvm_unreachable("unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_ABS8; } case FK_Data_2: switch (Modifier) { default: llvm_unreachable("unsupported modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_ABS16; } case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_ARM_NONE: return ELF::R_ARM_NONE; case MCSymbolRefExpr::VK_GOT: return ELF::R_ARM_GOT_BREL; case MCSymbolRefExpr::VK_TLSGD: return ELF::R_ARM_TLS_GD32; case MCSymbolRefExpr::VK_TPOFF: return ELF::R_ARM_TLS_LE32; case MCSymbolRefExpr::VK_GOTTPOFF: return ELF::R_ARM_TLS_IE32; case MCSymbolRefExpr::VK_None: return ELF::R_ARM_ABS32; case MCSymbolRefExpr::VK_GOTOFF: return ELF::R_ARM_GOTOFF32; case MCSymbolRefExpr::VK_ARM_GOT_PREL: return ELF::R_ARM_GOT_PREL; case MCSymbolRefExpr::VK_ARM_TARGET1: return ELF::R_ARM_TARGET1; case MCSymbolRefExpr::VK_ARM_TARGET2: return ELF::R_ARM_TARGET2; case MCSymbolRefExpr::VK_ARM_PREL31: return ELF::R_ARM_PREL31; case MCSymbolRefExpr::VK_ARM_SBREL: return ELF::R_ARM_SBREL32; case MCSymbolRefExpr::VK_ARM_TLSLDO: return ELF::R_ARM_TLS_LDO32; case MCSymbolRefExpr::VK_TLSCALL: return ELF::R_ARM_TLS_CALL; case MCSymbolRefExpr::VK_TLSDESC: return ELF::R_ARM_TLS_GOTDESC; case MCSymbolRefExpr::VK_TLSLDM: return ELF::R_ARM_TLS_LDM32; case MCSymbolRefExpr::VK_ARM_TLSDESCSEQ: return ELF::R_ARM_TLS_DESCSEQ; } case ARM::fixup_arm_condbranch: case ARM::fixup_arm_uncondbranch: return ELF::R_ARM_JUMP24; case ARM::fixup_arm_movt_hi16: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_MOVT_ABS; case MCSymbolRefExpr::VK_ARM_SBREL: return ELF::R_ARM_MOVT_BREL; } case ARM::fixup_arm_movw_lo16: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_MOVW_ABS_NC; case MCSymbolRefExpr::VK_ARM_SBREL: return ELF::R_ARM_MOVW_BREL_NC; } case ARM::fixup_t2_movt_hi16: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_THM_MOVT_ABS; case MCSymbolRefExpr::VK_ARM_SBREL: return ELF::R_ARM_THM_MOVT_BREL; } case ARM::fixup_t2_movw_lo16: switch (Modifier) { default: llvm_unreachable("Unsupported Modifier"); case MCSymbolRefExpr::VK_None: return ELF::R_ARM_THM_MOVW_ABS_NC; case MCSymbolRefExpr::VK_ARM_SBREL: return ELF::R_ARM_THM_MOVW_BREL_NC; } } }
unsigned HexagonELFObjectWriter::getRelocType(MCContext &Ctx, MCValue const &Target, MCFixup const &Fixup, bool IsPCRel) const { MCSymbolRefExpr::VariantKind Variant = Target.getAccessVariant(); switch ((unsigned)Fixup.getKind()) { default: report_fatal_error("Unrecognized relocation type"); break; case FK_Data_4: switch(Variant) { case MCSymbolRefExpr::VariantKind::VK_PPC_DTPREL: return ELF::R_HEX_DTPREL_32; case MCSymbolRefExpr::VariantKind::VK_GOT: return ELF::R_HEX_GOT_32; case MCSymbolRefExpr::VariantKind::VK_GOTREL: return ELF::R_HEX_GOTREL_32; case MCSymbolRefExpr::VariantKind::VK_Hexagon_GD_GOT: return ELF::R_HEX_GD_GOT_32; case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE: return ELF::R_HEX_IE_32; case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE_GOT: return ELF::R_HEX_IE_GOT_32; case MCSymbolRefExpr::VariantKind::VK_Hexagon_LD_GOT: return ELF::R_HEX_LD_GOT_32; case MCSymbolRefExpr::VariantKind::VK_Hexagon_PCREL: return ELF::R_HEX_32_PCREL; case MCSymbolRefExpr::VariantKind::VK_PPC_TPREL: return ELF::R_HEX_TPREL_32; case MCSymbolRefExpr::VariantKind::VK_None: return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32; default: report_fatal_error("Unrecognized variant type"); }; case FK_PCRel_4: return ELF::R_HEX_32_PCREL; case FK_Data_2: switch(Variant) { case MCSymbolRefExpr::VariantKind::VK_PPC_DTPREL: return ELF::R_HEX_DTPREL_16; case MCSymbolRefExpr::VariantKind::VK_GOT: return ELF::R_HEX_GOT_16; case MCSymbolRefExpr::VariantKind::VK_Hexagon_GD_GOT: return ELF::R_HEX_GD_GOT_16; case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE_GOT: return ELF::R_HEX_IE_GOT_16; case MCSymbolRefExpr::VariantKind::VK_Hexagon_LD_GOT: return ELF::R_HEX_LD_GOT_16; case MCSymbolRefExpr::VariantKind::VK_PPC_TPREL: return ELF::R_HEX_TPREL_16; case MCSymbolRefExpr::VariantKind::VK_None: return ELF::R_HEX_16; default: report_fatal_error("Unrecognized variant type"); }; case FK_Data_1: return ELF::R_HEX_8; case fixup_Hexagon_B22_PCREL: return ELF::R_HEX_B22_PCREL; case fixup_Hexagon_B15_PCREL: return ELF::R_HEX_B15_PCREL; case fixup_Hexagon_B7_PCREL: return ELF::R_HEX_B7_PCREL; case fixup_Hexagon_LO16: return ELF::R_HEX_LO16; case fixup_Hexagon_HI16: return ELF::R_HEX_HI16; case fixup_Hexagon_32: return ELF::R_HEX_32; case fixup_Hexagon_16: return ELF::R_HEX_16; case fixup_Hexagon_8: return ELF::R_HEX_8; case fixup_Hexagon_GPREL16_0: return ELF::R_HEX_GPREL16_0; case fixup_Hexagon_GPREL16_1: return ELF::R_HEX_GPREL16_1; case fixup_Hexagon_GPREL16_2: return ELF::R_HEX_GPREL16_2; case fixup_Hexagon_GPREL16_3: return ELF::R_HEX_GPREL16_3; case fixup_Hexagon_HL16: return ELF::R_HEX_HL16; case fixup_Hexagon_B13_PCREL: return ELF::R_HEX_B13_PCREL; case fixup_Hexagon_B9_PCREL: return ELF::R_HEX_B9_PCREL; case fixup_Hexagon_B32_PCREL_X: return ELF::R_HEX_B32_PCREL_X; case fixup_Hexagon_32_6_X: return ELF::R_HEX_32_6_X; case fixup_Hexagon_B22_PCREL_X: return ELF::R_HEX_B22_PCREL_X; case fixup_Hexagon_B15_PCREL_X: return ELF::R_HEX_B15_PCREL_X; case fixup_Hexagon_B13_PCREL_X: return ELF::R_HEX_B13_PCREL_X; case fixup_Hexagon_B9_PCREL_X: return ELF::R_HEX_B9_PCREL_X; case fixup_Hexagon_B7_PCREL_X: return ELF::R_HEX_B7_PCREL_X; case fixup_Hexagon_16_X: return ELF::R_HEX_16_X; case fixup_Hexagon_12_X: return ELF::R_HEX_12_X; case fixup_Hexagon_11_X: return ELF::R_HEX_11_X; case fixup_Hexagon_10_X: return ELF::R_HEX_10_X; case fixup_Hexagon_9_X: return ELF::R_HEX_9_X; case fixup_Hexagon_8_X: return ELF::R_HEX_8_X; case fixup_Hexagon_7_X: return ELF::R_HEX_7_X; case fixup_Hexagon_6_X: return ELF::R_HEX_6_X; case fixup_Hexagon_32_PCREL: return ELF::R_HEX_32_PCREL; case fixup_Hexagon_COPY: return ELF::R_HEX_COPY; case fixup_Hexagon_GLOB_DAT: return ELF::R_HEX_GLOB_DAT; case fixup_Hexagon_JMP_SLOT: return ELF::R_HEX_JMP_SLOT; case fixup_Hexagon_RELATIVE: return ELF::R_HEX_RELATIVE; case fixup_Hexagon_PLT_B22_PCREL: return ELF::R_HEX_PLT_B22_PCREL; case fixup_Hexagon_GOTREL_LO16: return ELF::R_HEX_GOTREL_LO16; case fixup_Hexagon_GOTREL_HI16: return ELF::R_HEX_GOTREL_HI16; case fixup_Hexagon_GOTREL_32: return ELF::R_HEX_GOTREL_32; case fixup_Hexagon_GOT_LO16: return ELF::R_HEX_GOT_LO16; case fixup_Hexagon_GOT_HI16: return ELF::R_HEX_GOT_HI16; case fixup_Hexagon_GOT_32: return ELF::R_HEX_GOT_32; case fixup_Hexagon_GOT_16: return ELF::R_HEX_GOT_16; case fixup_Hexagon_DTPMOD_32: return ELF::R_HEX_DTPMOD_32; case fixup_Hexagon_DTPREL_LO16: return ELF::R_HEX_DTPREL_LO16; case fixup_Hexagon_DTPREL_HI16: return ELF::R_HEX_DTPREL_HI16; case fixup_Hexagon_DTPREL_32: return ELF::R_HEX_DTPREL_32; case fixup_Hexagon_DTPREL_16: return ELF::R_HEX_DTPREL_16; case fixup_Hexagon_GD_PLT_B22_PCREL: return ELF::R_HEX_GD_PLT_B22_PCREL; case fixup_Hexagon_LD_PLT_B22_PCREL: return ELF::R_HEX_LD_PLT_B22_PCREL; case fixup_Hexagon_GD_GOT_LO16: return ELF::R_HEX_GD_GOT_LO16; case fixup_Hexagon_GD_GOT_HI16: return ELF::R_HEX_GD_GOT_HI16; case fixup_Hexagon_GD_GOT_32: return ELF::R_HEX_GD_GOT_32; case fixup_Hexagon_GD_GOT_16: return ELF::R_HEX_GD_GOT_16; case fixup_Hexagon_LD_GOT_LO16: return ELF::R_HEX_LD_GOT_LO16; case fixup_Hexagon_LD_GOT_HI16: return ELF::R_HEX_LD_GOT_HI16; case fixup_Hexagon_LD_GOT_32: return ELF::R_HEX_LD_GOT_32; case fixup_Hexagon_LD_GOT_16: return ELF::R_HEX_LD_GOT_16; case fixup_Hexagon_IE_LO16: return ELF::R_HEX_IE_LO16; case fixup_Hexagon_IE_HI16: return ELF::R_HEX_IE_HI16; case fixup_Hexagon_IE_32: return ELF::R_HEX_IE_32; case fixup_Hexagon_IE_GOT_LO16: return ELF::R_HEX_IE_GOT_LO16; case fixup_Hexagon_IE_GOT_HI16: return ELF::R_HEX_IE_GOT_HI16; case fixup_Hexagon_IE_GOT_32: return ELF::R_HEX_IE_GOT_32; case fixup_Hexagon_IE_GOT_16: return ELF::R_HEX_IE_GOT_16; case fixup_Hexagon_TPREL_LO16: return ELF::R_HEX_TPREL_LO16; case fixup_Hexagon_TPREL_HI16: return ELF::R_HEX_TPREL_HI16; case fixup_Hexagon_TPREL_32: return ELF::R_HEX_TPREL_32; case fixup_Hexagon_TPREL_16: return ELF::R_HEX_TPREL_16; case fixup_Hexagon_6_PCREL_X: return ELF::R_HEX_6_PCREL_X; case fixup_Hexagon_GOTREL_32_6_X: return ELF::R_HEX_GOTREL_32_6_X; case fixup_Hexagon_GOTREL_16_X: return ELF::R_HEX_GOTREL_16_X; case fixup_Hexagon_GOTREL_11_X: return ELF::R_HEX_GOTREL_11_X; case fixup_Hexagon_GOT_32_6_X: return ELF::R_HEX_GOT_32_6_X; case fixup_Hexagon_GOT_16_X: return ELF::R_HEX_GOT_16_X; case fixup_Hexagon_GOT_11_X: return ELF::R_HEX_GOT_11_X; case fixup_Hexagon_DTPREL_32_6_X: return ELF::R_HEX_DTPREL_32_6_X; case fixup_Hexagon_DTPREL_16_X: return ELF::R_HEX_DTPREL_16_X; case fixup_Hexagon_DTPREL_11_X: return ELF::R_HEX_DTPREL_11_X; case fixup_Hexagon_GD_GOT_32_6_X: return ELF::R_HEX_GD_GOT_32_6_X; case fixup_Hexagon_GD_GOT_16_X: return ELF::R_HEX_GD_GOT_16_X; case fixup_Hexagon_GD_GOT_11_X: return ELF::R_HEX_GD_GOT_11_X; case fixup_Hexagon_LD_GOT_32_6_X: return ELF::R_HEX_LD_GOT_32_6_X; case fixup_Hexagon_LD_GOT_16_X: return ELF::R_HEX_LD_GOT_16_X; case fixup_Hexagon_LD_GOT_11_X: return ELF::R_HEX_LD_GOT_11_X; case fixup_Hexagon_IE_32_6_X: return ELF::R_HEX_IE_32_6_X; case fixup_Hexagon_IE_16_X: return ELF::R_HEX_IE_16_X; case fixup_Hexagon_IE_GOT_32_6_X: return ELF::R_HEX_IE_GOT_32_6_X; case fixup_Hexagon_IE_GOT_16_X: return ELF::R_HEX_IE_GOT_16_X; case fixup_Hexagon_IE_GOT_11_X: return ELF::R_HEX_IE_GOT_11_X; case fixup_Hexagon_TPREL_32_6_X: return ELF::R_HEX_TPREL_32_6_X; case fixup_Hexagon_TPREL_16_X: return ELF::R_HEX_TPREL_16_X; case fixup_Hexagon_TPREL_11_X: return ELF::R_HEX_TPREL_11_X; } }
unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const { // determine the type of the relocation MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant(); unsigned Type; if (getEMachine() == ELF::EM_X86_64) { if (IsPCRel) { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); case FK_Data_8: Type = ELF::R_X86_64_PC64; break; case FK_Data_4: Type = ELF::R_X86_64_PC32; break; case FK_Data_2: Type = ELF::R_X86_64_PC16; break; case FK_Data_1: Type = ELF::R_X86_64_PC8; break; case FK_PCRel_8: assert(Modifier == MCSymbolRefExpr::VK_None); Type = ELF::R_X86_64_PC64; break; case X86::reloc_signed_4byte: case X86::reloc_riprel_4byte_movq_load: case X86::reloc_riprel_4byte: case FK_PCRel_4: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_X86_64_PC32; break; case MCSymbolRefExpr::VK_PLT: Type = ELF::R_X86_64_PLT32; break; case MCSymbolRefExpr::VK_GOTPCREL: Type = ELF::R_X86_64_GOTPCREL; break; case MCSymbolRefExpr::VK_GOTTPOFF: Type = ELF::R_X86_64_GOTTPOFF; break; case MCSymbolRefExpr::VK_TLSGD: Type = ELF::R_X86_64_TLSGD; break; case MCSymbolRefExpr::VK_TLSLD: Type = ELF::R_X86_64_TLSLD; break; } break; case FK_PCRel_2: assert(Modifier == MCSymbolRefExpr::VK_None); Type = ELF::R_X86_64_PC16; break; case FK_PCRel_1: assert(Modifier == MCSymbolRefExpr::VK_None); Type = ELF::R_X86_64_PC8; break; } } else { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); case X86::reloc_global_offset_table8: Type = ELF::R_X86_64_GOTPC64; break; case X86::reloc_global_offset_table: Type = ELF::R_X86_64_GOTPC32; break; case FK_Data_8: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_X86_64_64; break; case MCSymbolRefExpr::VK_GOT: Type = ELF::R_X86_64_GOT64; break; case MCSymbolRefExpr::VK_GOTOFF: Type = ELF::R_X86_64_GOTOFF64; break; case MCSymbolRefExpr::VK_TPOFF: Type = ELF::R_X86_64_TPOFF64; break; case MCSymbolRefExpr::VK_DTPOFF: Type = ELF::R_X86_64_DTPOFF64; break; } break; case X86::reloc_signed_4byte: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_X86_64_32S; break; case MCSymbolRefExpr::VK_GOT: Type = ELF::R_X86_64_GOT32; break; case MCSymbolRefExpr::VK_GOTPCREL: Type = ELF::R_X86_64_GOTPCREL; break; case MCSymbolRefExpr::VK_TPOFF: Type = ELF::R_X86_64_TPOFF32; break; case MCSymbolRefExpr::VK_DTPOFF: Type = ELF::R_X86_64_DTPOFF32; break; } break; case FK_Data_4: Type = ELF::R_X86_64_32; break; case FK_Data_2: Type = ELF::R_X86_64_16; break; case FK_PCRel_1: case FK_Data_1: Type = ELF::R_X86_64_8; break; } } } else if (getEMachine() == ELF::EM_386) { if (IsPCRel) { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); case X86::reloc_global_offset_table: Type = ELF::R_386_GOTPC; break; case FK_PCRel_1: case FK_Data_1: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_386_PC8; break; } break; case FK_PCRel_2: case FK_Data_2: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_386_PC16; break; } break; case X86::reloc_signed_4byte: case FK_PCRel_4: case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_386_PC32; break; case MCSymbolRefExpr::VK_PLT: Type = ELF::R_386_PLT32; break; } break; } } else { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); case X86::reloc_global_offset_table: Type = ELF::R_386_GOTPC; break; // FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode // instead? case X86::reloc_signed_4byte: case FK_PCRel_4: case FK_Data_4: switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: Type = ELF::R_386_32; break; case MCSymbolRefExpr::VK_GOT: Type = ELF::R_386_GOT32; break; case MCSymbolRefExpr::VK_PLT: Type = ELF::R_386_PLT32; break; case MCSymbolRefExpr::VK_GOTOFF: Type = ELF::R_386_GOTOFF; break; case MCSymbolRefExpr::VK_TLSGD: Type = ELF::R_386_TLS_GD; break; case MCSymbolRefExpr::VK_TPOFF: Type = ELF::R_386_TLS_LE_32; break; case MCSymbolRefExpr::VK_INDNTPOFF: Type = ELF::R_386_TLS_IE; break; case MCSymbolRefExpr::VK_NTPOFF: Type = ELF::R_386_TLS_LE; break; case MCSymbolRefExpr::VK_GOTNTPOFF: Type = ELF::R_386_TLS_GOTIE; break; case MCSymbolRefExpr::VK_TLSLDM: Type = ELF::R_386_TLS_LDM; break; case MCSymbolRefExpr::VK_DTPOFF: Type = ELF::R_386_TLS_LDO_32; break; case MCSymbolRefExpr::VK_GOTTPOFF: Type = ELF::R_386_TLS_IE_32; break; } break; case FK_Data_2: Type = ELF::R_386_16; break; case FK_PCRel_1: case FK_Data_1: Type = ELF::R_386_8; break; } } } else llvm_unreachable("Unsupported ELF machine type."); return Type; }