llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.04k stars 11.58k forks source link

Linker Warning: Hard-float 'd' ABI can't be used for a target that doesn't support the D instruction set extension (ignoring target-abi) #69780

Open hiraditya opened 11 months ago

hiraditya commented 11 months ago

This happens while building aosp with lto. A reduced case of building libziparchive also gives this warning. Here is the linker invocation.

"clang/host/linux-x86/clang-r498229b/bin/ld.lld" -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf64lriscv -X -shared -o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_shared_cfi/unstripped/libziparchive.so -Lclang/host/linux-x86/clang-r498229b/lib/clang/17/lib/linux/riscv64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/lib -L/usr/lib -plugin-opt=mcpu=generic-rv64 --no-demangle --export-dynamic-symbol=__cfi_check out/soong/.intermediates/bionic/libc/crtbegin_so/android_vendor_ramdisk_riscv64/crtbegin_so.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_archive.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_archive_stream_entry.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_cd_entry_map.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_error.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_writer.o out/soong/.intermediates/external/libcxxabi/libc++demangle/android_vendor_ramdisk_riscv64_static_lto-none/libc++demangle.a prebuilts/clang/host/linux-x86/clang-r498229b/lib/clang/17/lib/linux/libclang_rt.ubsan_minimal-riscv64-android.a prebuilts/clang/host/linux-x86/clang-r498229b/lib/clang/17/lib/linux/libclang_rt.builtins-riscv64-android.a out/soong/.intermediates/system/logging/liblog/liblog/android_vendor_ramdisk_riscv64_shared/liblog.so out/soong/.intermediates/system/libbase/libbase/android_vendor_ramdisk_riscv64_shared/libbase.so out/soong/.intermediates/external/zlib/libz/android_vendor_ramdisk_riscv64_shared/libz.so out/soong/.intermediates/external/libcxx/libc++/android_vendor_ramdisk_riscv64_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_vendor_ramdisk_riscv64_shared/libc.so out/soong/.intermediates/bionic/libm/libm/android_vendor_ramdisk_riscv64_shared/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_vendor_ramdisk_riscv64_shared/libdl.so out/soong/.intermediates/bionic/libc/crtend_so/android_vendor_ramdisk_riscv64/crtend_so.o -z noexecstack -z relro -z now --build-id=md5 --fatal-warnings --no-undefined-version --exclude-libs libgcc.a --exclude-libs libgcc_stripped.a --exclude-libs libunwind_llvm.a --exclude-libs libunwind.a -mllvm -regalloc-enable-advisor=release --icf=safe --pack-dyn-relocs=android+relr --no-undefined --hash-style=gnu -z max-page-size=4096 -plugin-opt -emulated-tls=0 --gc-sections -soname libziparchive.so -plugin-opt O1 --exclude-libs=libclang_rt.builtins-riscv64-android.a --exclude-libs=libclang_rt.ubsan_minimal-riscv64-android.a

All the binary files (including the ones in .a) have 'double-float ABI'. it could be that the bitcode files 'out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/*.o' are not getting compiled with the double-float flag?

Repro steps if you one can download aosp.

$ lunch aosp_riscv64-userdebug
$ cd system/libziparchive
$ mm

Related discussions/PRs/issues:

llvmbot commented 11 months ago

@llvm/issue-subscribers-backend-risc-v

Author: AdityaK (hiraditya)

This happens while building aosp with lto. A reduced case of building libziparchive also gives this warning. Here is the linker invocation. > "clang/host/linux-x86/clang-r498229b/bin/ld.lld" -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf64lriscv -X -shared -o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_shared_cfi/unstripped/libziparchive.so -Lclang/host/linux-x86/clang-r498229b/lib/clang/17/lib/linux/riscv64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/lib -L/usr/lib -plugin-opt=mcpu=generic-rv64 --no-demangle --export-dynamic-symbol=__cfi_check out/soong/.intermediates/bionic/libc/crtbegin_so/android_vendor_ramdisk_riscv64/crtbegin_so.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_archive.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_archive_stream_entry.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_cd_entry_map.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_error.o out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/zip_writer.o out/soong/.intermediates/external/libcxxabi/libc++demangle/android_vendor_ramdisk_riscv64_static_lto-none/libc++demangle.a prebuilts/clang/host/linux-x86/clang-r498229b/lib/clang/17/lib/linux/libclang_rt.ubsan_minimal-riscv64-android.a prebuilts/clang/host/linux-x86/clang-r498229b/lib/clang/17/lib/linux/libclang_rt.builtins-riscv64-android.a out/soong/.intermediates/system/logging/liblog/liblog/android_vendor_ramdisk_riscv64_shared/liblog.so out/soong/.intermediates/system/libbase/libbase/android_vendor_ramdisk_riscv64_shared/libbase.so out/soong/.intermediates/external/zlib/libz/android_vendor_ramdisk_riscv64_shared/libz.so out/soong/.intermediates/external/libcxx/libc++/android_vendor_ramdisk_riscv64_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_vendor_ramdisk_riscv64_shared/libc.so out/soong/.intermediates/bionic/libm/libm/android_vendor_ramdisk_riscv64_shared/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_vendor_ramdisk_riscv64_shared/libdl.so out/soong/.intermediates/bionic/libc/crtend_so/android_vendor_ramdisk_riscv64/crtend_so.o -z noexecstack -z relro -z now --build-id=md5 --fatal-warnings --no-undefined-version --exclude-libs libgcc.a --exclude-libs libgcc_stripped.a --exclude-libs libunwind_llvm.a --exclude-libs libunwind.a -mllvm -regalloc-enable-advisor=release --icf=safe --pack-dyn-relocs=android+relr --no-undefined --hash-style=gnu -z max-page-size=4096 -plugin-opt -emulated-tls=0 --gc-sections -soname libziparchive.so -plugin-opt O1 --exclude-libs=libclang_rt.builtins-riscv64-android.a --exclude-libs=libclang_rt.ubsan_minimal-riscv64-android.a All the binary files (including the ones in .a) have 'double-float ABI'. it could be that the bitcode files 'out/soong/.intermediates/system/libziparchive/libziparchive/android_vendor_ramdisk_riscv64_static_cfi_lto-none/obj/system/libziparchive/*.o' are not getting compiled with the double-float flag? Related discussions/PR: - [https://discourse.llvm.org/t/myterious-soft-float-output-in-lto-cache/70753](https://www.google.com/url?q=https://discourse.llvm.org/t/myterious-soft-float-output-in-lto-cache/70753) - [[RISCV] Ensure target features get passed to the LTO linker for RISC-V](https://reviews.llvm.org/D132843)
hiraditya commented 11 months ago

cc: @topperc @teresajohnson

hiraditya commented 10 months ago

Maybe we should also improve the warning to include the offending file that is causing the issue?

The warning comes from:

llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -92,7 +92,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
     ABI = Subtarget.is64Bit() ? RISCVABI::ABI_LP64 : RISCVABI::ABI_ILP32;
   } else if ((ABI == RISCVABI::ABI_ILP32D || ABI == RISCVABI::ABI_LP64D) &&
              !Subtarget.hasStdExtD()) {
hiraditya commented 1 month ago

The warning is only emitted from (IIUC) compiler generated functions like

define void @__cfi_check(i64 %0, ptr %1, ptr %2) align 4096
define private void @.cfi.jumptable() #46 align 8 

Seems like the bug is in functions like CrossDSOCFI::buildCFICheck(Module &M) where the compiler doesn't provide desired target attributes for generated functions.

Currently arm has a hacky way of adding target-feature when generating __cfi_check (https://github.com/llvm/llvm-project/blob/4ed543d414b6f39fb5302322eecb8abf33c76f89/llvm/lib/Transforms/IPO/CrossDSOCFI.cpp#L94-L100) but it is likely other places were missed.

Seems like we are missing something like a 'target-feature-unification' pass as the final binary can only support a specific ABI.

hiraditya commented 1 month ago

Related patch #98673