forked from OSchip/llvm-project
[mips][ias] Work around incorrect another microMIPS relocation evaluation exposed by r268900
As explained in r269196, microMIPS has a special case that is not correctly implemented in LLVM. If we have a symbol 'foo' which is equivalent to '.text+0x10'. The value of an R_MICROMIPS_LO16 relocation using 'foo' is 'foo+0x11' and not 'foo+0x10'. The in-place addend should therefore be 0x11. This commit reverts a little more of the effect of r268900 by keeping the symbol when the STO_MIPS_MICROMIPS flag is set for R_MIPS_GPREL32 relocations. This fixes SingleSource/UnitTests/2003-08-11-VaListArg, and SingleSource/UnitTests/2003-05-07-VarArgs for microMIPS. I believe there are additional relocations that have the same issue (e.g. R_MIPS_64, and R_MIPS_GPREL16) but for now I'm focusing on restoring our internal buildbots back to the green state we had in r268899. llvm-svn: 269294
This commit is contained in:
parent
3a0736e279
commit
5fb391c893
|
@ -518,13 +518,13 @@ bool MipsELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym,
|
||||||
|
|
||||||
case ELF::R_MIPS_16:
|
case ELF::R_MIPS_16:
|
||||||
case ELF::R_MIPS_32:
|
case ELF::R_MIPS_32:
|
||||||
|
case ELF::R_MIPS_GPREL32:
|
||||||
if (cast<MCSymbolELF>(Sym).getOther() & ELF::STO_MIPS_MICROMIPS)
|
if (cast<MCSymbolELF>(Sym).getOther() & ELF::STO_MIPS_MICROMIPS)
|
||||||
return true;
|
return true;
|
||||||
// fallthrough
|
// fallthrough
|
||||||
case ELF::R_MIPS_26:
|
case ELF::R_MIPS_26:
|
||||||
case ELF::R_MIPS_64:
|
case ELF::R_MIPS_64:
|
||||||
case ELF::R_MIPS_GPREL16:
|
case ELF::R_MIPS_GPREL16:
|
||||||
case ELF::R_MIPS_GPREL32:
|
|
||||||
case ELF::R_MIPS_PC16:
|
case ELF::R_MIPS_PC16:
|
||||||
case ELF::R_MIPS_SUB:
|
case ELF::R_MIPS_SUB:
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -9,12 +9,21 @@
|
||||||
// baz is equivalent to .text+0x8 and is recorded in the symbol table as such
|
// baz is equivalent to .text+0x8 and is recorded in the symbol table as such
|
||||||
// but it refers to microMIPS code so the addend must indicate this in the LSB.
|
// but it refers to microMIPS code so the addend must indicate this in the LSB.
|
||||||
// The addend must therefore be 0x9.
|
// The addend must therefore be 0x9.
|
||||||
|
// DATA-LABEL: Name: .text
|
||||||
|
// DATA: SectionData (
|
||||||
// DATA: 0000: 30430000 30420009
|
// DATA: 0000: 30430000 30420009
|
||||||
addiu $2, $3, %got(baz)
|
addiu $2, $3, %got(baz)
|
||||||
addiu $2, $2, %lo(baz)
|
addiu $2, $2, %lo(baz)
|
||||||
baz:
|
baz:
|
||||||
|
|
||||||
|
// DATA-LABEL: Name: .data
|
||||||
|
// DATA: SectionData (
|
||||||
.data
|
.data
|
||||||
.word 0
|
.word 0
|
||||||
bar:
|
bar:
|
||||||
.word 1
|
.word 1
|
||||||
|
// baz is equivalent to .text+0x8 and is recorded in the symbol table as such
|
||||||
|
// but it refers to microMIPS code so the addend must indicate this in the LSB.
|
||||||
|
// The addend must therefore be 0x9.
|
||||||
|
// DATA: 0000: 00000000 00000001 00000009
|
||||||
|
.gpword baz
|
||||||
|
|
Loading…
Reference in New Issue