mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 04:39:44 +00:00
Support for microMIPS relocations 1.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193247 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
25b2715489
commit
0082717cb5
@ -880,6 +880,17 @@ enum {
|
||||
R_MIPS_GLOB_DAT = 51,
|
||||
R_MIPS_COPY = 126,
|
||||
R_MIPS_JUMP_SLOT = 127,
|
||||
R_MICROMIPS_HI16 = 134,
|
||||
R_MICROMIPS_LO16 = 135,
|
||||
R_MICROMIPS_GOT16 = 138,
|
||||
R_MICROMIPS_CALL16 = 142,
|
||||
R_MICROMIPS_GOT_DISP = 145,
|
||||
R_MICROMIPS_GOT_PAGE = 146,
|
||||
R_MICROMIPS_GOT_OFST = 147,
|
||||
R_MICROMIPS_TLS_DTPREL_HI16 = 164,
|
||||
R_MICROMIPS_TLS_DTPREL_LO16 = 165,
|
||||
R_MICROMIPS_TLS_TPREL_HI16 = 169,
|
||||
R_MICROMIPS_TLS_TPREL_LO16 = 170,
|
||||
R_MIPS_NUM = 218
|
||||
};
|
||||
|
||||
|
@ -161,6 +161,17 @@ StringRef getELFRelocationTypeName(uint32_t Machine, uint32_t Type) {
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_GLOB_DAT);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_COPY);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_JUMP_SLOT);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_HI16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_LO16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_CALL16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT_DISP);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT_PAGE);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT_OFST);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_DTPREL_HI16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_DTPREL_LO16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_TPREL_HI16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_TPREL_LO16);
|
||||
LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MIPS_NUM);
|
||||
default:
|
||||
break;
|
||||
|
@ -45,6 +45,10 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
|
||||
case Mips::fixup_Mips_GOT_DISP:
|
||||
case Mips::fixup_Mips_GOT_LO16:
|
||||
case Mips::fixup_Mips_CALL_LO16:
|
||||
case Mips::fixup_MICROMIPS_LO16:
|
||||
case Mips::fixup_MICROMIPS_GOT_PAGE:
|
||||
case Mips::fixup_MICROMIPS_GOT_OFST:
|
||||
case Mips::fixup_MICROMIPS_GOT_DISP:
|
||||
break;
|
||||
case Mips::fixup_Mips_PC16:
|
||||
// So far we are only using this type for branches.
|
||||
@ -65,6 +69,7 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
|
||||
case Mips::fixup_Mips_GOT_Local:
|
||||
case Mips::fixup_Mips_GOT_HI16:
|
||||
case Mips::fixup_Mips_CALL_HI16:
|
||||
case Mips::fixup_MICROMIPS_HI16:
|
||||
// Get the 2nd 16-bits. Also add 1 if bit 15 is 1.
|
||||
Value = ((Value + 0x8000) >> 16) & 0xffff;
|
||||
break;
|
||||
@ -188,7 +193,18 @@ public:
|
||||
{ "fixup_Mips_GOT_HI16", 0, 16, 0 },
|
||||
{ "fixup_Mips_GOT_LO16", 0, 16, 0 },
|
||||
{ "fixup_Mips_CALL_HI16", 0, 16, 0 },
|
||||
{ "fixup_Mips_CALL_LO16", 0, 16, 0 }
|
||||
{ "fixup_Mips_CALL_LO16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_HI16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_LO16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_GOT16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_CALL16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_GOT_DISP", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_GOT_PAGE", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_GOT_OFST", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_TLS_DTPREL_HI16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_TLS_DTPREL_LO16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_TLS_TPREL_HI16", 0, 16, 0 },
|
||||
{ "fixup_MICROMIPS_TLS_TPREL_LO16", 0, 16, 0 }
|
||||
};
|
||||
|
||||
if (Kind < FirstTargetFixupKind)
|
||||
|
@ -183,6 +183,39 @@ unsigned MipsELFObjectWriter::GetRelocType(const MCValue &Target,
|
||||
case Mips::fixup_Mips_CALL_LO16:
|
||||
Type = ELF::R_MIPS_CALL_LO16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_HI16:
|
||||
Type = ELF::R_MICROMIPS_HI16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_LO16:
|
||||
Type = ELF::R_MICROMIPS_LO16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_GOT16:
|
||||
Type = ELF::R_MICROMIPS_GOT16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_CALL16:
|
||||
Type = ELF::R_MICROMIPS_CALL16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_GOT_DISP:
|
||||
Type = ELF::R_MICROMIPS_GOT_DISP;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_GOT_PAGE:
|
||||
Type = ELF::R_MICROMIPS_GOT_PAGE;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_GOT_OFST:
|
||||
Type = ELF::R_MICROMIPS_GOT_OFST;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_TLS_DTPREL_HI16:
|
||||
Type = ELF::R_MICROMIPS_TLS_DTPREL_HI16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_TLS_DTPREL_LO16:
|
||||
Type = ELF::R_MICROMIPS_TLS_DTPREL_LO16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_TLS_TPREL_HI16:
|
||||
Type = ELF::R_MICROMIPS_TLS_TPREL_HI16;
|
||||
break;
|
||||
case Mips::fixup_MICROMIPS_TLS_TPREL_LO16:
|
||||
Type = ELF::R_MICROMIPS_TLS_TPREL_LO16;
|
||||
break;
|
||||
}
|
||||
return Type;
|
||||
}
|
||||
|
@ -128,6 +128,39 @@ namespace Mips {
|
||||
// resulting in - R_MIPS_CALL_LO16
|
||||
fixup_Mips_CALL_LO16,
|
||||
|
||||
// resulting in - R_MICROMIPS_HI16
|
||||
fixup_MICROMIPS_HI16,
|
||||
|
||||
// resulting in - R_MICROMIPS_LO16
|
||||
fixup_MICROMIPS_LO16,
|
||||
|
||||
// resulting in - R_MICROMIPS_GOT16
|
||||
fixup_MICROMIPS_GOT16,
|
||||
|
||||
// resulting in - R_MICROMIPS_CALL16
|
||||
fixup_MICROMIPS_CALL16,
|
||||
|
||||
// resulting in - R_MICROMIPS_GOT_DISP
|
||||
fixup_MICROMIPS_GOT_DISP,
|
||||
|
||||
// resulting in - R_MICROMIPS_GOT_PAGE
|
||||
fixup_MICROMIPS_GOT_PAGE,
|
||||
|
||||
// resulting in - R_MICROMIPS_GOT_OFST
|
||||
fixup_MICROMIPS_GOT_OFST,
|
||||
|
||||
// resulting in - R_MICROMIPS_TLS_DTPREL_HI16
|
||||
fixup_MICROMIPS_TLS_DTPREL_HI16,
|
||||
|
||||
// resulting in - R_MICROMIPS_TLS_DTPREL_LO16
|
||||
fixup_MICROMIPS_TLS_DTPREL_LO16,
|
||||
|
||||
// resulting in - R_MICROMIPS_TLS_TPREL_HI16
|
||||
fixup_MICROMIPS_TLS_TPREL_HI16,
|
||||
|
||||
// resulting in - R_MICROMIPS_TLS_TPREL_LO16
|
||||
fixup_MICROMIPS_TLS_TPREL_LO16,
|
||||
|
||||
// Marker
|
||||
LastTargetFixupKind,
|
||||
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
|
||||
|
@ -320,31 +320,39 @@ getExprOpValue(const MCExpr *Expr,SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
FixupKind = Mips::fixup_Mips_GPOFF_LO;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_PAGE :
|
||||
FixupKind = Mips::fixup_Mips_GOT_PAGE;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_GOT_PAGE
|
||||
: Mips::fixup_Mips_GOT_PAGE;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_OFST :
|
||||
FixupKind = Mips::fixup_Mips_GOT_OFST;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_GOT_OFST
|
||||
: Mips::fixup_Mips_GOT_OFST;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_DISP :
|
||||
FixupKind = Mips::fixup_Mips_GOT_DISP;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_GOT_DISP
|
||||
: Mips::fixup_Mips_GOT_DISP;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GPREL:
|
||||
FixupKind = Mips::fixup_Mips_GPREL16;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT_CALL:
|
||||
FixupKind = Mips::fixup_Mips_CALL16;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_CALL16
|
||||
: Mips::fixup_Mips_CALL16;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT16:
|
||||
FixupKind = Mips::fixup_Mips_GOT_Global;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_GOT16
|
||||
: Mips::fixup_Mips_GOT_Global;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOT:
|
||||
FixupKind = Mips::fixup_Mips_GOT_Local;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_GOT16
|
||||
: Mips::fixup_Mips_GOT_Local;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_ABS_HI:
|
||||
FixupKind = Mips::fixup_Mips_HI16;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_HI16
|
||||
: Mips::fixup_Mips_HI16;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_ABS_LO:
|
||||
FixupKind = Mips::fixup_Mips_LO16;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_LO16
|
||||
: Mips::fixup_Mips_LO16;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_TLSGD:
|
||||
FixupKind = Mips::fixup_Mips_TLSGD;
|
||||
@ -353,19 +361,23 @@ getExprOpValue(const MCExpr *Expr,SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
FixupKind = Mips::fixup_Mips_TLSLDM;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_DTPREL_HI:
|
||||
FixupKind = Mips::fixup_Mips_DTPREL_HI;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16
|
||||
: Mips::fixup_Mips_DTPREL_HI;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_DTPREL_LO:
|
||||
FixupKind = Mips::fixup_Mips_DTPREL_LO;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16
|
||||
: Mips::fixup_Mips_DTPREL_LO;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_GOTTPREL:
|
||||
FixupKind = Mips::fixup_Mips_GOTTPREL;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_TPREL_HI:
|
||||
FixupKind = Mips::fixup_Mips_TPREL_HI;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_TLS_TPREL_HI16
|
||||
: Mips::fixup_Mips_TPREL_HI;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_TPREL_LO:
|
||||
FixupKind = Mips::fixup_Mips_TPREL_LO;
|
||||
FixupKind = IsMicroMips ? Mips::fixup_MICROMIPS_TLS_TPREL_LO16
|
||||
: Mips::fixup_Mips_TPREL_LO;
|
||||
break;
|
||||
case MCSymbolRefExpr::VK_Mips_HIGHER:
|
||||
FixupKind = Mips::fixup_Mips_HIGHER;
|
||||
|
Loading…
Reference in New Issue
Block a user