clang 3.9.0 buildkernel on old powerpc64's vs. trying to build hwpmc_e500.o and the like. . . [Actually .__start code failure vs. working and R_PPC64_ADDR16_DS vs. R_PPC64_TOC16_DS]

Mark Millard markmi at dsl-only.net
Sat Jan 7 22:07:43 UTC 2017


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 at 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.

===
Mark Millard
markmi at dsl-only.net



More information about the freebsd-ppc mailing list