Building and testing compiler-rt builtins for riscv64-unknown-elf (original) (raw)

Hi, I’m trying to build and test the builtins part of compiler-rt for RISC-V using the following cmake cmake options:

export BUILD_C_FLAGS="--target=riscv64-unknown-elf -march=rv64gc --gcc-toolchain=$RISCV_GCC_TOOLCHAIN --sysroot=$RISCV_SYSROOT"
export TEST_C_FLAGS="$BUILD_C_FLAGS"

cmake $LLVM_SRC/compiler-rt \
  -G "Ninja" \
  -DCOMPILER_RT_OS_DIR="baremetal" \
  -DCOMPILER_RT_BUILD_BUILTINS=ON \
  -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
  -DCOMPILER_RT_BUILD_MEMPROF=OFF \
  -DCOMPILER_RT_BUILD_PROFILE=OFF \
  -DCOMPILER_RT_BUILD_SANITIZERS=OFF \
  -DCOMPILER_RT_BUILD_XRAY=OFF \
  -DCMAKE_C_COMPILER=$LLVM_BUILD/bin/clang \
  -DCMAKE_C_COMPILER_TARGET="riscv64-unknown-elf" \
  -DCMAKE_ASM_COMPILER_TARGET="riscv64-unknown-elf" \
  -DCMAKE_AR=$LLVM_BUILD/bin/llvm-ar \
  -DCMAKE_NM=$LLVM_BUILD/bin/llvm-nm \
  -DCMAKE_RANLIB=$LLVM_BUILD/bin/llvm-ranlib \
  -DCOMPILER_RT_BAREMETAL_BUILD=ON \
  -DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
  -DLLVM_CONFIG_PATH=$LLVM_BUILD/bin/llvm-config \
  -DCMAKE_C_FLAGS="$BUILD_C_FLAGS" \
  -DCMAKE_ASM_FLAGS="$BUILD_C_FLAGS" \
  -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \
  -DCOMPILER_RT_INCLUDE_TESTS=ON \
  -DCOMPILER_RT_EMULATOR="qemu-riscv64 -L $RISCV_SYSROOT" \
  -DCOMPILER_RT_TEST_COMPILER=$LLVM_BUILD/bin/clang \
  -DCOMPILER_RT_TEST_COMPILER_CFLAGS="$TEST_C_FLAGS"

ninja builtin
ninja check-builtin

The builtin library libclang_rt.builtins-riscv64.a is successfuly built, but the tests are failed to built.

Use the test udivmodti4_test.c as an example, the command used for building and testing udivmodti4_test.c is:

clang -gline-tables-only  --target=riscv64-unknown-elf -march=rv64gc --gcc-toolchain=/path/to/gcc-toolchain/ --sysroot=/path/to/sysroot/riscv64-unknown-elf/ -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -fno-builtin -I <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi><mi>L</mi><mi>V</mi><msub><mi>M</mi><mi>S</mi></msub><mi>R</mi><mi>C</mi><mi mathvariant="normal">/</mi><mi>c</mi><mi>o</mi><mi>m</mi><mi>p</mi><mi>i</mi><mi>l</mi><mi>e</mi><mi>r</mi><mo>−</mo><mi>r</mi><mi>t</mi><mi mathvariant="normal">/</mi><mi>l</mi><mi>i</mi><mi>b</mi><mi mathvariant="normal">/</mi><mi>b</mi><mi>u</mi><mi>i</mi><mi>l</mi><mi>t</mi><mi>i</mi><mi>n</mi><mi>s</mi><mo>−</mo><mi>n</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>f</mi><mi>a</mi><mi>u</mi><mi>l</mi><mi>t</mi><mi>l</mi><mi>i</mi><mi>b</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">LLVM_SRC/compiler-rt/lib/builtins -nodefaultlibs </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">LL</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.07153em;">RC</span><span class="mord">/</span><span class="mord mathnormal">co</span><span class="mord mathnormal">m</span><span class="mord mathnormal">p</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">t</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">ib</span><span class="mord">/</span><span class="mord mathnormal">b</span><span class="mord mathnormal">u</span><span class="mord mathnormal">i</span><span class="mord mathnormal">lt</span><span class="mord mathnormal">in</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal">o</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.01968em;">ltl</span><span class="mord mathnormal">ib</span><span class="mord mathnormal">s</span></span></span></span>LLVM_SRC/compiler-rt/test/builtins/Unit/udivmodti4_test.c /path/to/libclang_rt.builtins-riscv64.a -lc -lm -o udivmodti4_test.c.tmp && qemu-riscv64 -L $RISCV_SYSROOT udivmodti4_test.c.tmp

udivmodti4_test.c is failed to build because lots of undefined references, e.g. undefined reference to __multf3, _write …

libclang_rt.builtins-riscv64.a has the definition of __multf3

readelf -sW libclang_rt.builtins-riscv64.a | grep __multf3 shows:
    85: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __multf3
    40: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __multf3
    82: 0000000000000002    56 FUNC    GLOBAL HIDDEN     2 __multf3
    12: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __multf3

I saw libgloss.a locates in riscv64-unknown-elf/lib/ has the symbol _write:

readelf -sW ~/opt/riscv/riscv64-unknown-elf/lib/libgloss.a | grep _write
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS sys_write.c
    11: 0000000000000000    48 FUNC    GLOBAL DEFAULT    4 _write

If I manually add -lgloss /path/to/libclang_rt.builtins-riscv64.a after -lc -lm, then udivmodti4_test.c succeeds to build:

clang -gline-tables-only  --target=riscv64-unknown-elf -march=rv64gc --gcc-toolchain=/path/to/gcc-toolchain/ --sysroot=/path/to/sysroot/riscv64-unknown-elf/ -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -fno-builtin -I <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi><mi>L</mi><mi>V</mi><msub><mi>M</mi><mi>S</mi></msub><mi>R</mi><mi>C</mi><mi mathvariant="normal">/</mi><mi>c</mi><mi>o</mi><mi>m</mi><mi>p</mi><mi>i</mi><mi>l</mi><mi>e</mi><mi>r</mi><mo>−</mo><mi>r</mi><mi>t</mi><mi mathvariant="normal">/</mi><mi>l</mi><mi>i</mi><mi>b</mi><mi mathvariant="normal">/</mi><mi>b</mi><mi>u</mi><mi>i</mi><mi>l</mi><mi>t</mi><mi>i</mi><mi>n</mi><mi>s</mi><mo>−</mo><mi>n</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>f</mi><mi>a</mi><mi>u</mi><mi>l</mi><mi>t</mi><mi>l</mi><mi>i</mi><mi>b</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">LLVM_SRC/compiler-rt/lib/builtins -nodefaultlibs </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">LL</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.07153em;">RC</span><span class="mord">/</span><span class="mord mathnormal">co</span><span class="mord mathnormal">m</span><span class="mord mathnormal">p</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">t</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">ib</span><span class="mord">/</span><span class="mord mathnormal">b</span><span class="mord mathnormal">u</span><span class="mord mathnormal">i</span><span class="mord mathnormal">lt</span><span class="mord mathnormal">in</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal">o</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.01968em;">ltl</span><span class="mord mathnormal">ib</span><span class="mord mathnormal">s</span></span></span></span>LLVM_SRC/compiler-rt/test/builtins/Unit/udivmodti4_test.c /path/to/libclang_rt.builtins-riscv64.a -lc -lm -o udivmodti4_test.c.tmp && qemu-riscv64 -L $RISCV_SYSROOT udivmodti4_test.c.tmp

My question: is there something wrong with the above cmake options, how to solve the builtin tests build failure?
Thanks!