[PATCH] Re-enable a hook in MCELFObjectTargetWriter to allow target-specific relocationtable sorting and use this hook for Mips.
Rafael Ávila de Espíndola
rafael.espindola at gmail.com
Thu Feb 19 19:03:28 PST 2015
> About the relocations that must match another:
>
> -mips32, mips64:
> R_MIPS_HI16 and local R_MIPS_GOT16 must match R_MIPS_LO16 against the same
> symbol.
>
> -micromips:
> R_MICROMIPS_HI16 and local R_MICROMIPS_GOT16 must match R_MICROMIPS_LO16
> against the same symbol.
>
> -mips16:
> R_MIPS16_HI16 and local R_MIPS16_GOT16 must match R_MIPS16_LO16 against the same
> symbol.
And it is not possible for a file to mix relocations from these sets? I.E, no file will ever have a R_MIPS16_LO16 and a R_MIPS_HI16? If that is not the case I think there is a bug in gold :-)
> Now, since mips16 and micromips are a work in progress, I would rather skip
> handling them for now (ie. return generic sortRelocs() and add a TODO for the
> HI16/GOT16 exceptions). E.g., instead of R_MICROMIPS_LO16, llvm currently
> generates R_MIPS_LO16, so I can't even add a micromips test that will pass at
> the moment.
That is fine. An assert would be better than a comment to make sure it gets implemented :-)
> For the deterministic output - in the examples I ran, when entering sortRelocs()
> relocs were sorted by offset in the ascending order. But I will add a call to
> generic sortRelocs() at the beginning of the function, to make the output
> deterministic for sure.
Yes, I honestly cannot remember where the non determinism was coming from, but I do remember the original function sorting only by Offest and we having issues.
> And, apart from HI16/GOT16, I would like to sort relocs by offset - like other
> architectures and mips gcc do.
MC suffer a lot from trying to produce object files that look like what gas produces. I know this is mostly my fault, but if I can help us move to a point where every 'if' in the writer has a good justification that would be awesome.
> A quote from binutils source (binutils/bfd/elfxx-mips.c):
>
> The ABI requires that the *LO16 immediately follow the *HI16.
> However, as a GNU extension, we permit an arbitrary number of
> *HI16s to be associated with a single *LO16.
Check. It seems to be what gold implements.
> The logic I used in the code below is the simplest I came up with to obey the
> rule above: for every HI16 / local GOT16 relocation at the given offset, pair it
> with the first found LO16 relocation against the same symbol, starting from
> offset + 4 and ending at offset -4. (Wrap around reloc table size.)
That is something that needs to be explicitly documented, since it is the semantic of the of assembly file, which is potentially an user input.
> GCC does it differently; here is a comment about it from
> binutils/gas/config/tc-mips.c:
>
> When several %lo()s match a particular %got() or %hi(), we use the
> following rules to distinguish them:
>
> (1) %lo()s with smaller offsets are a better match than %lo()s with
> higher offsets.
>
> (2) %lo()s with no matching %got() or %hi() are better than those
> that already have a matching %got() or %hi().
>
> (3) later %lo()s are better than earlier %lo()s.
> These rules are applied in order.
>
>
>
> Thus, for this example:
>
> lui $2, %hi(func2)
> lui $2, %hi(func2)
> addiu $2, $2, %lo(func2)
> addiu $2, $2, %lo(func2)
>
>
>
> the code below sorts the table like this:
>
> Offset Info Type Sym.Value Sym. Name
>
> 00000000 00000605 R_MIPS_HI16 00000000 func2
> 00000004 00000605 R_MIPS_HI16 00000000 func2
> 00000008 00000606 R_MIPS_LO16 00000000 func2
> 0000000c 00000606 R_MIPS_LO16 00000000 func2
>
> and this is what gcc does:
>
> Offset Info Type Sym.Value Sym. Name
>
> 00000004 00000605 R_MIPS_HI16 00000000 func2
> 00000008 00000606 R_MIPS_LO16 00000000 func2
> 00000000 00000605 R_MIPS_HI16 00000000 func2
> 0000000c 00000606 R_MIPS_LO16 00000000 func2
>
> So, at least for consistency reasons, maybe I should change this code to behave
> like gcc. What do you think?
I agree. We should implement the same *semantics* as gas.
In the above comment, what does "match", "earlier" and "in order" mean?
REPOSITORY
rL LLVM
http://reviews.llvm.org/D7414
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
More information about the llvm-commits
mailing list