[llvm-dev] Do I need to modify the AddrLoc of LLD for ARC target?
Leslie Zhai via llvm-dev
llvm-dev at lists.llvm.org
Wed Sep 13 23:16:46 PDT 2017
Hi LLVM developers,
basic-arc.s:
main:
bl memset
$ arc-elf32-gcc -mcpu=arc600 -o basic-arc.o -c
$ arc-elf32-readelf -r basic-arc.o
Relocation section '.rela.text' at offset 0xd4 contains 1 entries:
Offset Info Type Sym.Value Sym. Name + Addend
00000000 00000611 R_ARC_S25W_PCREL 00000000 memset + 0
High address: 0x0
$ arc-elf32-ld -o basic-arc basic-arc.o
-L/opt/arc-gnu/lib/gcc/arc-elf32/7.1.1/arc600
-L/opt/arc-gnu/lib/gcc/arc-elf32/7.1.1/../../../../arc-elf32/lib/arc600
-L/opt/arc-gnu/lib/gcc/arc-elf32/7.1.1
-L/opt/arc-gnu/lib/gcc/arc-elf32/7.1.1/../../../../arc-elf32/lib
--start-group -lgcc -lc -lnosys --end-group -Ttext=0
DEBUG: arc-ld: R_ARC_S25W_PCREL relocation: 1 S: 4 A: 0 P: 0 = (vma: 0 +
output_offset: 0 + reloc_offset: 0 - 0) & ~0x3
DEBUG: arc-ld: type: R_ARC_S25W_PCREL insn: 2054
$ ld.lld -o basic-arc-lld basic-arc.o $ARC_LINKER_LIB -Ttext=0
DEBUG: lld: R_ARC_S25W_PCREL TargetVA: 4 A: 0 P: 0 <-- same P as arc-ld
DEBUG: lld: R_ARC_S25W_PCREL: Insn: 2050 Rel: 1
DEBUG: lld: R_ARC_S25W_PCREL: Insn: 2054 <-- same relocation value as arc-ld
But with several different high address *not* 0x0, such as 0x6:
DEBUG: arc-ld: R_ARC_S25W_PCREL relocation: 2 S: 12 A: 0 P: 4 = (vma: 6
+ output_offset: 0 + reloc_offset: 0 - 0) & ~0x3
DEBUG: arc-ld: type: R_ARC_S25W_PCREL insn: 2058
DEBUG: lld: R_ARC_S25W_PCREL TargetVA: 4 A: 0 P: 8 <-- different P?
DEBUG: lld: R_ARC_S25W_PCREL: Insn: 2050 Rel: 1
DEBUG: lld: R_ARC_S25W_PCREL: Insn: 2054 <-- different relocation value
How arc-ld calculates P?
P = ((reloc_data.input_section->output_section ?
reloc_data.input_section->output_section->vma : 0) +
reloc_data.input_section->output_offset + (reloc_data.reloc_offset -
(reloc_data.bitsize >= 32 ? 4 : 0))) & ~0x3;
for example, R_ARC_S25W_PCREL's bitsize < 32, P = (6 + 0 + 0 - 0) & ~0x3
= 4, when vma is 6, output and reloc offset is 0.
How LLD calculates P (AddrLoc)?
P = getOutputSection()->Addr + getOffset(Rel.Offset);
for example, the same high address 0x6, LLD's P is 8, different with
arc-ld? so do I need to modify the value of P for R_PC case in the
getRelocTargetVA? please give me some hints, thanks a lot!
PS: arc-ld R_ARC_S25W_PCREL's FORMULA is: ( S + A ) - P ) >> 2, and it
needs middle endian convert, so:
Insn = middleEndianConvert (insn, TRUE);
Insn = replaceDisp25w(Insn, ( S + A ) - P ) >> 2);
Insn = middleEndianConvert (insn, TRUE);
write32le(Loc, Insn);
--
Regards,
Leslie Zhai - https://reviews.llvm.org/p/xiangzhai/
More information about the llvm-dev
mailing list