diff options
Diffstat (limited to 'llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp | 61 |
1 files changed, 18 insertions, 43 deletions
diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp index cc3168790b981..9c317e3f8840f 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -234,14 +234,15 @@ unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx, case Mips::fixup_Mips_32: case FK_Data_4: return IsPCRel ? ELF::R_MIPS_PC32 : ELF::R_MIPS_32; + case Mips::fixup_Mips_64: + case FK_Data_8: + return IsPCRel + ? setRTypes(ELF::R_MIPS_PC32, ELF::R_MIPS_64, ELF::R_MIPS_NONE) + : (unsigned)ELF::R_MIPS_64; } if (IsPCRel) { switch (Kind) { - case FK_Data_8: - Ctx.reportError(Fixup.getLoc(), - "MIPS does not support 64-bit PC-relative relocations"); - return ELF::R_MIPS_NONE; case Mips::fixup_Mips_Branch_PCRel: case Mips::fixup_Mips_PC16: return ELF::R_MIPS_PC16; @@ -277,9 +278,6 @@ unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx, } switch (Kind) { - case Mips::fixup_Mips_64: - case FK_Data_8: - return ELF::R_MIPS_64; case FK_DTPRel_4: return ELF::R_MIPS_TLS_DTPREL32; case FK_DTPRel_8: @@ -289,14 +287,9 @@ unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx, case FK_TPRel_8: return ELF::R_MIPS_TLS_TPREL64; case FK_GPRel_4: - if (is64Bit()) { - unsigned Type = (unsigned)ELF::R_MIPS_NONE; - Type = setRType((unsigned)ELF::R_MIPS_GPREL32, Type); - Type = setRType2((unsigned)ELF::R_MIPS_64, Type); - Type = setRType3((unsigned)ELF::R_MIPS_NONE, Type); - return Type; - } - return ELF::R_MIPS_GPREL32; + return setRTypes(ELF::R_MIPS_GPREL32, + is64Bit() ? ELF::R_MIPS_64 : ELF::R_MIPS_NONE, + ELF::R_MIPS_NONE); case Mips::fixup_Mips_GPREL16: return ELF::R_MIPS_GPREL16; case Mips::fixup_Mips_26: @@ -329,34 +322,16 @@ unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx, return ELF::R_MIPS_GOT_OFST; case Mips::fixup_Mips_GOT_DISP: return ELF::R_MIPS_GOT_DISP; - case Mips::fixup_Mips_GPOFF_HI: { - unsigned Type = (unsigned)ELF::R_MIPS_NONE; - Type = setRType((unsigned)ELF::R_MIPS_GPREL16, Type); - Type = setRType2((unsigned)ELF::R_MIPS_SUB, Type); - Type = setRType3((unsigned)ELF::R_MIPS_HI16, Type); - return Type; - } - case Mips::fixup_MICROMIPS_GPOFF_HI: { - unsigned Type = (unsigned)ELF::R_MIPS_NONE; - Type = setRType((unsigned)ELF::R_MICROMIPS_GPREL16, Type); - Type = setRType2((unsigned)ELF::R_MICROMIPS_SUB, Type); - Type = setRType3((unsigned)ELF::R_MICROMIPS_HI16, Type); - return Type; - } - case Mips::fixup_Mips_GPOFF_LO: { - unsigned Type = (unsigned)ELF::R_MIPS_NONE; - Type = setRType((unsigned)ELF::R_MIPS_GPREL16, Type); - Type = setRType2((unsigned)ELF::R_MIPS_SUB, Type); - Type = setRType3((unsigned)ELF::R_MIPS_LO16, Type); - return Type; - } - case Mips::fixup_MICROMIPS_GPOFF_LO: { - unsigned Type = (unsigned)ELF::R_MIPS_NONE; - Type = setRType((unsigned)ELF::R_MICROMIPS_GPREL16, Type); - Type = setRType2((unsigned)ELF::R_MICROMIPS_SUB, Type); - Type = setRType3((unsigned)ELF::R_MICROMIPS_LO16, Type); - return Type; - } + case Mips::fixup_Mips_GPOFF_HI: + return setRTypes(ELF::R_MIPS_GPREL16, ELF::R_MIPS_SUB, ELF::R_MIPS_HI16); + case Mips::fixup_MICROMIPS_GPOFF_HI: + return setRTypes(ELF::R_MICROMIPS_GPREL16, ELF::R_MICROMIPS_SUB, + ELF::R_MICROMIPS_HI16); + case Mips::fixup_Mips_GPOFF_LO: + return setRTypes(ELF::R_MIPS_GPREL16, ELF::R_MIPS_SUB, ELF::R_MIPS_LO16); + case Mips::fixup_MICROMIPS_GPOFF_LO: + return setRTypes(ELF::R_MICROMIPS_GPREL16, ELF::R_MICROMIPS_SUB, + ELF::R_MICROMIPS_LO16); case Mips::fixup_Mips_HIGHER: return ELF::R_MIPS_HIGHER; case Mips::fixup_Mips_HIGHEST: |