[I've supplied a list of places that adding @toc notation should make clang 3.9.1 targeting powerpc64 do the right thing for this issue.]
On 2017-Jan-7, at 2:07 PM, Mark Millard <markmi at dsl-only.net> wrote: > On 2017-Jan-7, at 12:51 AM, Roman Divacky <rdivacky at vlakno.cz> wrote: > >> That's a great progress. Can you produce minimal self contained test case >> that >> exhibits this bug? And submit it to llvm bugzilla? >> >> Also, clang3.9 defaults to using it's own internal asm, what happens if you >> add -no-integrated-as to CFLAGS and recompile the kernel? That should remove >> this llvm assembly problem. Does it boot? >> >> Thanks Mark, really great progress. >> >> Roman > > In attempting this I found how to control the behavior based on > the assembler notation @toc being missing vs. being present. > > If llvm should change is strongly tied to llvm's criteria for > gcc compatibility relative to filling-in/defaulting omitted > @toc's in the assembler notation. > > FreeBSD has the option of always being explicit with @toc in order > to avoid differences in handling of omitted notation. > > So I've no clue if FreebSD wants to claim that a llvm change > is a requirement for using clang as the powerpc64 system compiler. > > [The issue of the distinction is submittable to llvm either way.] > > Details. . . > > For: > > .section ".toc","aw" > tmpstk.L: .tc tmpstk[TC],tmpstk > . . . > /* Set up the stack pointer */ > ld %r1,tmpstk.L(%r2) > > using devel/powerpc64-gcc gets: > > # /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc \ > > > -c \ > > > > -x assembler-with-cpp \ > > > -pipe \ > > > > locore64_simplified.S > locore64_simplified.S: Assembler messages: > locore64_simplified.S:80: Warning: assuming @toc on symbol > > and produces (with R_PPC64_TOC16_DS for .toc): > > # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o > > locore64_simplified.o: file format elf64-powerpc-freebsd > > RELOCATION RECORDS FOR [.text]: > OFFSET TYPE VALUE > 0000000000000028 R_PPC64_REL64 __tocbase+0x0000000000008000 > 0000000000000046 R_PPC64_TOC16_DS .toc > > > RELOCATION RECORDS FOR [.toc]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 tmpstk > > > RELOCATION RECORDS FOR [.opd]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 .__start > 0000000000000008 R_PPC64_TOC *ABS* > > > By contrast clang is silent (cross compiler used): > > # > /usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bin/cc > \ > > -target powerpc64-unknown-freebsd12.0 \ > > > > --sysroot=/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp \ > > > > -B/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bin \ > > > > -c \ > > > -x assembler-with-cpp > \ > > > -pipe \ > > > locore64_simplified.S > > and produces code with R_PPC64_ADDR16_DS for the .toc instead: > > # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o | more > > > > locore64_simplified.o: file format elf64-powerpc-freebsd > > RELOCATION RECORDS FOR [.text]: > OFFSET TYPE VALUE > 0000000000000028 R_PPC64_REL64 __tocbase+0x0000000000008000 > 0000000000000046 R_PPC64_ADDR16_DS .toc > > > RELOCATION RECORDS FOR [.toc]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 tmpstk > > > RELOCATION RECORDS FOR [.opd]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 .__start > 0000000000000008 R_PPC64_TOC *ABS* > > > > But for: > > .section ".toc","aw" > tmpstk.L: .tc tmpstk[TC],tmpstk > . . . > /* Set up the stack pointer */ > ld %r1,tmpstk.L@toc(%r2) > > (note the @toc notation) both compilers agree and use > R_PPC64_TOC16_DS for the .toc: > > # /usr/local/bin/powerpc64-unknown-freebsd12.0-gcc \ > > > -c \ > > > > -x assembler-with-cpp \ > > > -pipe \ > > > > locore64_simplified.S > > # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o | more > > > > locore64_simplified.o: file format elf64-powerpc-freebsd > > RELOCATION RECORDS FOR [.text]: > OFFSET TYPE VALUE > 0000000000000028 R_PPC64_REL64 __tocbase+0x0000000000008000 > 0000000000000046 R_PPC64_TOC16_DS .toc > > > RELOCATION RECORDS FOR [.toc]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 tmpstk > > > RELOCATION RECORDS FOR [.opd]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 .__start > 0000000000000008 R_PPC64_TOC *ABS* > > > # > /usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bin/cc > \ > > -target powerpc64-unknown-freebsd12.0 \ > > > > --sysroot=/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp \ > > > > -B/usr/obj/powerpc64vtsc_clang_kernel/powerpc.powerpc64/usr/src/tmp/usr/bin \ > > > > -c \ > > > -x assembler-with-cpp > \ > > > -pipe \ > > > locore64_simplified.S > > # /usr/local/powerpc64-freebsd/bin/objdump -r locore64_simplified.o | more > > > > locore64_simplified.o: file format elf64-powerpc-freebsd > > RELOCATION RECORDS FOR [.text]: > OFFSET TYPE VALUE > 0000000000000028 R_PPC64_REL64 __tocbase+0x0000000000008000 > 0000000000000046 R_PPC64_TOC16_DS .toc > > > RELOCATION RECORDS FOR [.toc]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 tmpstk > > > RELOCATION RECORDS FOR [.opd]: > OFFSET TYPE VALUE > 0000000000000000 R_PPC64_ADDR64 .__start > 0000000000000008 R_PPC64_TOC *ABS* > > > > I omitted "-f -gdwarf-2" to simplify things but with such > clang complains about: > > locore64_simplified.S:36:2: warning: DWARF2 only supports one section per > compilation unit > .section ".toc","aw" > ^ > locore64_simplified.S:47:2: warning: DWARF2 only supports one section per > compilation unit > .section ".opd","aw" > ^ > > (buildkernel gets such messages.) > > > I expect I can simplify the .S code more than I have so far but > I figured I'd report the discovery of the choice FreeBSD needs > to make for powerpc64 for if llvm changes are to be required > vs. not. The following should be a list of the places that adding @toc usage would fix some things for using clang 3.9.1 to target powerpc64: # grep "@toc[^b]" /root/sys_typescripts/typescript_make_powerpc64vtsc_nodebug_incl_clang_xtoolchain_kernel-amd64-host-2017-01-03:23:48:41 | more /usr/src/sys/powerpc/aim/locore64.S:102: Warning: assuming @toc on symbol /usr/src/sys/powerpc/aim/trap_subr64.S:320: Warning: assuming @toc on symbol /usr/src/sys/powerpc/aim/trap_subr64.S:797: Warning: assuming @toc on symbol /usr/src/sys/powerpc/ofw/ofwcall64.S:104: Warning: assuming @toc on symbol /usr/src/sys/powerpc/ofw/ofwcall64.S:108: Warning: assuming @toc on symbol /usr/src/sys/powerpc/ofw/ofwcall64.S:116: Warning: assuming @toc on symbol /usr/src/sys/powerpc/ofw/ofwcall64.S:226: Warning: assuming @toc on symbol /usr/src/sys/powerpc/ofw/ofwcall64.S:228: Warning: assuming @toc on symbol /usr/src/sys/powerpc/ofw/ofwcall64.S:235: Warning: assuming @toc on symbol /usr/src/sys/powerpc/powerpc/swtch64.S:153: Warning: assuming @toc on symbol devel/powerpc64-gcc and devel/powerpc64-binutils together happens to report on missing @toc 's. But, of course, if some sections of code are conditionally compiled and excluded above they would not be listed. === Mark Millard markmi at dsl-only.net _______________________________________________ [email protected] mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain To unsubscribe, send any mail to "[email protected]"
