[fpc-devel] x86_64 case jumptables should work
Matthias K.
makadev at googlemail.com
Tue Jun 26 22:13:18 CEST 2012
Hi,
After playing around with the jumptable generation for x86_64 (Linux)
--> x86/nx86set.pas, i couldn't reproduce bug #0011931 anymore.
Before someone else reiterates the building/testing/elf dumping, i'll
describe shortly what i've found.
The code generation for jumptables didn't change since #0011931, so
i've inspected the data sections generated. For a simple testlibrary,
the library code/data itself was correct but the pulled in rtl
code/data wasn't (see Appendix1 / Appendix 2).
The jumptable indices point to the section start which result in
unexpected behavior on branch.
After "elf/obj dumping around" a bit and bisecting, i've hit the
corresponding commit, which fixes x86_64 addend calculation for these
reloc types, svn commit 17556 (or 17580), which refers to #19416 about
const pointers (and the jumptable is a const pointer collection ;) )
Can someone verify it (probably also for other target OS using x86_64)
and then re-enable jumptables for trunk (and back-port to fixes 2.6)?
Regards,
Matthias
Appendix1 system.o:
-----------------
svn 17555; system.o; data.rel bits
Relocation section '.rela.data.rel' at offset 0x5546c contains 799 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000000 000200000001 R_X86_64_64 0000000000000000 .text + 0
000000000008 000200000001 R_X86_64_64 0000000000000000 .text + 0
...
which is a wrong (on relocation, R_X86_64_64 is relocated
SECTION/SYMBOL + ADDEND) and
svn 17556; system.o; data.rel bits
Relocation section '.rela.data.rel' at offset 0xaa468 contains 799 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000000 000200000001 R_X86_64_64 0000000000000000 .text + ae5
000000000008 000200000001 R_X86_64_64 0000000000000000 .text + b15
...
with correct addend.
-----------------
Appendix2 some testlibrary
-----------------
pre svn 17555: jumptable (or const ptr's) relocation entries
Offset Type Value
...
0000000000226df8 R_X86_64_RELATIVE *ABS*+0x00000000002270f0 #
.Ljumptable at GOTPCREL -> 2270f0
...
00000000002270f0 R_X86_64_RELATIVE *ABS*+0x0000000000006650 # idx 0
-> "section base"
00000000002270f8 R_X86_64_RELATIVE *ABS*+0x0000000000006650 # idx 1
-> "section base"
0000000000227100 R_X86_64_RELATIVE *ABS*+0x0000000000006650 # idx 2
-> "section base"
...
svn 17556+: jumptable (or const ptr's) relocation entries
...
0000000000227df0 R_X86_64_RELATIVE *ABS*+0x00000000002280f0 #
.Ljumptable at GOTPCREL -> 2280f0
...
00000000002280f0 R_X86_64_RELATIVE *ABS*+0x0000000000007125 # idx 0
-> caseblock 1
00000000002280f8 R_X86_64_RELATIVE *ABS*+0x0000000000007155 # idx 1
-> caseblock 2 (actualy, caseblock 5 or so)
0000000000228100 R_X86_64_RELATIVE *ABS*+0x000000000000713d # idx 2
-> caseblock 3
0000000000228108 R_X86_64_RELATIVE *ABS*+0x000000000000713d # idx 3
-> caseblock 3
...
-----------------
More information about the fpc-devel
mailing list