diff --git a/cc.sh b/cc.sh index 5e28812..e57c718 100755 --- a/cc.sh +++ b/cc.sh @@ -797,6 +797,19 @@ elif [ "$SPACK_ADD_DEBUG_FLAGS" = "custom" ]; then extend flags_list SPACK_DEBUG_FLAGS fi +# Inject compiler-supplied file-prefix-remapping flag(s) +case "$mode" in + cpp|as|cc|ccld) + if [ -n "${SPACK_PREFIX_MAP_ARGS:-}" ]; then + append flags_list "$SPACK_PREFIX_MAP_ARGS" + fi + if [ -n "${SPACK_BUILD_PREFIX_MAP_ARGS:-}" ] && \ + [ "$SPACK_BUILD_PREFIX_MAP_ARGS" != "${SPACK_PREFIX_MAP_ARGS:-}" ]; then + append flags_list "$SPACK_BUILD_PREFIX_MAP_ARGS" + fi + ;; +esac + spack_flags_list="" # Fortran flags come before CPPFLAGS @@ -878,6 +891,20 @@ if [ "$mode" = ld ] || [ "$mode" = ccld ]; then fi fi +# Enable GNU build-id notes for debuginfo auto-discovery. SPACK_BUILD_ID_ARGS +# is set per-compiler-package (e.g. gcc sets it on platform=linux); it is +# empty/unset on platforms or compilers that don't support it. +if [ "$mode" = ld ] || [ "$mode" = ccld ]; then + if [ -n "${SPACK_BUILD_ID_ARGS:-}" ]; then + case "$mode" in + ld) + append flags_list "$SPACK_BUILD_ID_ARGS" ;; + ccld) + append flags_list "$linker_arg$SPACK_BUILD_ID_ARGS" ;; + esac + fi +fi + if [ "$mode" = ccld ] || [ "$mode" = ld ]; then if [ "$add_rpaths" != "false" ]; then # Append RPATH directories. Note that in the case of the diff --git a/test/run.sh b/test/run.sh index bb9c2ac..eadcdb0 100755 --- a/test/run.sh +++ b/test/run.sh @@ -207,6 +207,9 @@ wrapper_environment() { SPACK_F77=$REAL_CC SPACK_HIPCXX=$REAL_CC SPACK_PREFIX=/spack-test-prefix + SPACK_PREFIX_MAP_ARGS='-ffile-prefix-map=/spack-test-stage/spack-src=.' + SPACK_BUILD_PREFIX_MAP_ARGS='-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' + SPACK_BUILD_ID_ARGS='--build-id' # shellcheck disable=SC2209 # literal string "test", not the command SPACK_COMPILER_WRAPPER_PATH=test SPACK_DEBUG_LOG_DIR=. @@ -234,6 +237,7 @@ wrapper_environment() { # shellcheck disable=SC2090 export SPACK_CC SPACK_CXX SPACK_FC SPACK_F77 SPACK_HIPCXX SPACK_PREFIX \ + SPACK_PREFIX_MAP_ARGS SPACK_BUILD_PREFIX_MAP_ARGS SPACK_BUILD_ID_ARGS \ SPACK_COMPILER_WRAPPER_PATH SPACK_DEBUG_LOG_DIR SPACK_DEBUG_LOG_ID \ SPACK_SHORT_SPEC SPACK_SYSTEM_DIRS SPACK_MANAGED_DIRS \ SPACK_CC_RPATH_ARG SPACK_CXX_RPATH_ARG SPACK_F77_RPATH_ARG SPACK_FC_RPATH_ARG \ @@ -394,8 +398,18 @@ LHEADERPAD='-Wl,-headerpad_max_install_names' HEADERPAD='-headerpad_max_install_names' DISABLE_NEW_DTAGS_WL='-Wl,--disable-new-dtags' DISABLE_NEW_DTAGS='--disable-new-dtags' +BUILD_ID_WL='-Wl,--build-id' +BUILD_ID='--build-id' + +PREFIX_MAP_FLAGS=$(cat <<'EOF' +-ffile-prefix-map=/spack-test-stage/spack-src=. +-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build +EOF +) COMMON_COMPILE_ARGS=$(concat \ + "$PREFIX_MAP_FLAGS" \ + "$BUILD_ID_WL" \ "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS_WL" \ @@ -500,6 +514,7 @@ EOF ) _exp=$(cat <<'EOF' ld +--build-id --disable-new-dtags foo.o bar.o @@ -522,7 +537,7 @@ foo -rpath EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' foo.o bar.o baz.o @@ -544,7 +559,7 @@ foo -Wl,-rpath EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' foo.o bar.o baz.o @@ -561,7 +576,7 @@ EOF -Wl,/c EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -Wl,-rpath,/a -Wl,-rpath,/b -Wl,-rpath,/c @@ -575,12 +590,12 @@ EOF -Wl,--rpath= EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "-Wl,-rpath,/a") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "-Wl,-rpath,/a") expect_args Wl_parsing_missing cc "$_args" "$_exp" # Wl_parsing_NAG_is_ignored _args='-Wl,-Wl,,x,,y,,z' - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$DISABLE_NEW_DTAGS_WL" "-Wl,-Wl,,x,,y,,z") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "-Wl,-Wl,,x,,y,,z") expect_args Wl_parsing_NAG fc "$_args" "$_exp" # Xlinker_parsing @@ -597,7 +612,7 @@ EOF -Xlinker EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -Wl,-rpath,/a -Wl,-rpath,/b -O3 @@ -615,7 +630,7 @@ EOF -g EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -O3 -g -Wl,-rpath @@ -631,7 +646,7 @@ EOF -g EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -O3 -g -Xlinker @@ -646,14 +661,14 @@ EOF # dep_include SPACK_INCLUDE_DIRS=x; export SPACK_INCLUDE_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" "-Ix" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Ix" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args dep_include cc "$TEST_ARGS" "$_exp" SPACK_INCLUDE_DIRS=''; export SPACK_INCLUDE_DIRS # dep_lib SPACK_LINK_DIRS=x; SPACK_RPATH_DIRS=x; export SPACK_LINK_DIRS SPACK_RPATH_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "-Lx" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "-Wl,-rpath,x" "$TEST_ARGS_NO_PATHS") expect_args dep_lib cc "$TEST_ARGS" "$_exp" @@ -661,7 +676,7 @@ EOF # dep_lib_no_rpath SPACK_LINK_DIRS=x; export SPACK_LINK_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "-Lx" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args dep_lib_no_rpath cc "$TEST_ARGS" "$_exp" @@ -669,7 +684,7 @@ EOF # dep_lib_no_lib SPACK_RPATH_DIRS=x; export SPACK_RPATH_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "-Wl,-rpath,x" "$TEST_ARGS_NO_PATHS") expect_args dep_lib_no_lib cc "$TEST_ARGS" "$_exp" @@ -681,7 +696,7 @@ EOF SPACK_LINK_DIRS=xlib:ylib:zlib export SPACK_INCLUDE_DIRS SPACK_RPATH_DIRS SPACK_LINK_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ @@ -694,7 +709,7 @@ EOF _args="$TEST_ARGS -isystem fooinc" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-isystem\nfooinc\n-isystem\nxinc\n-isystem\nyinc\n-isystem\nzinc')" \ "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ @@ -706,7 +721,7 @@ fooinc" # cc_deps (-c => mode=cc, no -L/rpath from deps) _args="-c $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$TEST_LIBRARY_PATHS" "-c" "$TEST_ARGS_NO_PATHS") expect_args cc_deps cc "$_args" "$_exp" @@ -722,7 +737,7 @@ EOF ) _args="$_sys $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$(printf -- '-I/usr/include\n-I/usr/local/include')" \ "$TEST_LIBRARY_PATHS" \ @@ -747,7 +762,7 @@ EOF ) _args="$_sys $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-isystem\nxinc\n-isystem\nyinc\n-isystem\nzinc')" \ "$(printf -- '-isystem\n/usr/include\n-isystem\n/usr/local/include')" \ "$TEST_LIBRARY_PATHS" \ @@ -760,7 +775,7 @@ $TEST_ARGS" expect_args ccld_with_system_dirs_isystem cc "$_args" "$_exp" # ld_deps - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" \ "$(printf -- '-rpath\nxlib\n-rpath\nylib\n-rpath\nzlib')" \ @@ -770,7 +785,7 @@ $TEST_ARGS" # ld_deps_no_rpath unset SPACK_RPATH_DIRS SPACK_RPATH_DIRS=''; export SPACK_RPATH_DIRS - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" \ "$TEST_ARGS_NO_PATHS") @@ -779,7 +794,7 @@ $TEST_ARGS" # ld_deps_no_link SPACK_RPATH_DIRS=xlib:ylib:zlib; export SPACK_RPATH_DIRS SPACK_LINK_DIRS=''; export SPACK_LINK_DIRS - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" \ "$(printf -- '-rpath\nxlib\n-rpath\nylib\n-rpath\nzlib')" \ "$TEST_ARGS_NO_PATHS") @@ -791,38 +806,38 @@ test_expected_args_with_flags() { wrapper_flags # ld_flags - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" "$TEST_ARGS_NO_PATHS" "$SPACK_LDLIBS_LINES") expect_args ld_flags ld "$TEST_ARGS" "$_exp" # cpp_flags - _exp=$(concat "cpp" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "cpp" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES") expect_args cpp_flags cpp "$TEST_ARGS" "$_exp" # cc_flags - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" "$SPACK_CFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args cc_flags cc "$TEST_ARGS" "$_exp" # cxx_flags (note: -Werror is filtered by SPACK_COMPILER_FLAGS_REPLACE) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args cxx_flags c++ "$TEST_ARGS" "$_exp" # fc_flags - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_FFLAGS_LINES" "$SPACK_CPPFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args fc_flags fc "$TEST_ARGS" "$_exp" # hip_flags (no target args; CPPFLAGS + HIPFLAGS applied; CFLAGS/CXXFLAGS absent) - _exp=$(concat "$REAL_CC" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" "$SPACK_HIPFLAGS_LINES" \ '-Wl,--gc-sections' "$SPACK_LDLIBS_LINES") @@ -872,11 +887,12 @@ test_ld_deps_partial() { SPACK_SHORT_SPEC='foo@1.2=linux-x86_64'; export SPACK_SHORT_SPEC _args="-r $TEST_ARGS" - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "-Lxlib" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "-Lxlib" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" "-rpath" "xlib" "-r" "$TEST_ARGS_NO_PATHS") expect_args ld_deps_partial_linux ld "$_args" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC + unset SPACK_BUILD_ID_ARGS _exp=$(concat "ld" "$HEADERPAD" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "-Lxlib" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" "-r" "$TEST_ARGS_NO_PATHS") expect_args ld_deps_partial_darwin ld "$_args" "$_exp" @@ -891,7 +907,10 @@ test_ccache_prepend_for_cc() { expect_args ccache_prepend_linux cc "$TEST_ARGS" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC - _exp=$(concat "ccache" "$REAL_CC" "$TARGET_ARGS" "$LHEADERPAD" "$COMMON_COMPILE_ARGS") + unset SPACK_BUILD_ID_ARGS + _exp=$(concat "ccache" "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$LHEADERPAD" \ + "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ + "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args ccache_prepend_darwin cc "$TEST_ARGS" "$_exp" } @@ -903,7 +922,10 @@ test_no_ccache_prepend_for_fc() { expect_args no_ccache_fc_linux fc "$TEST_ARGS" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$LHEADERPAD" "$COMMON_COMPILE_ARGS") + unset SPACK_BUILD_ID_ARGS + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$LHEADERPAD" \ + "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ + "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args no_ccache_fc_darwin fc "$TEST_ARGS" "$_exp" } @@ -1446,7 +1468,7 @@ test_x_is_not_a_language_for_ld() { for _ld in ld ld.gold ld.lld; do expect_args "${_ld}_x" "$_ld" '-x hip -foo.o' "$(concat "$_ld" "$DISABLE_NEW_DTAGS" -x hip foo.o)" +foo.o' "$(concat "$_ld" "$BUILD_ID" "$DISABLE_NEW_DTAGS" -x hip foo.o)" done } @@ -1456,7 +1478,7 @@ test_hip_always_flags() { # applied on the compile line ... expect_args hip_always_compile spackhip '-c -foo.hip' "$(concat "$REAL_CC" -c foo.hip -always1 -always2)" +foo.hip' "$(concat "$REAL_CC" "$PREFIX_MAP_FLAGS" -c foo.hip -always1 -always2)" # ... and on version checks, like every other language _args='-v @@ -1479,6 +1501,93 @@ test_x_hip_vcheck() { --version' /bin/myhipcxx } +# --------------------------------------------------------------------------- +# SPACK_PREFIX_MAP / SPACK_BUILD_PREFIX_MAP / BUILD-ID injection +# --------------------------------------------------------------------------- + +test_prefix_map_injected() { + wrapper_environment + # wrapper_environment sets: + # SPACK_PREFIX_MAP=/spack-test-stage/spack-src + # SPACK_BUILD_PREFIX_MAP=/spack-test-stage/spack-build-abc1234 + + # Both flags must appear for C. + _out=$(dump_args cc '') + expect_contains debug_prefix_map_cc "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_contains debug_build_prefix_map_cc "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' + + # Both must appear for C++. + _out=$(dump_args c++ '') + expect_contains debug_prefix_map_cxx "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_contains debug_build_prefix_map_cxx "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' + + # Both must appear for Fortran. + _out=$(dump_args fc '') + expect_contains debug_prefix_map_fc "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_contains debug_build_prefix_map_fc "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' + + # Neither must appear in vcheck mode. + _out=$(dump_args cc '--version') + expect_not_contains debug_prefix_map_vcheck "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_not_contains debug_build_prefix_map_vcheck "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' + + # Neither must appear in plain ld mode. + _out=$(dump_args ld '') + expect_not_contains debug_prefix_map_ld "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_not_contains debug_build_prefix_map_ld "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' +} + +test_prefix_map_dedup() { + wrapper_environment + # When source and build dirs coincide (in-source build), only one + # -ffile-prefix-map flag should be emitted, not a duplicate. + SPACK_BUILD_PREFIX_MAP_ARGS="$SPACK_PREFIX_MAP_ARGS" + export SPACK_BUILD_PREFIX_MAP_ARGS + + _out=$(dump_args cc '') + _count=$(printf '%s\n' "$_out" | grep -Fxc -- "$SPACK_PREFIX_MAP_ARGS") + if [ "$_count" -ne 1 ]; then + fail "prefix_map_dedup: expected exactly 1 occurrence, got $_count" + fi +} + +test_prefix_map_absent_when_unsupported() { + wrapper_environment + unset SPACK_PREFIX_MAP_ARGS + unset SPACK_BUILD_PREFIX_MAP_ARGS + + # Wrapper must still succeed and emit no -ffile-prefix-map flags at all. + _out=$(dump_args cc '') + if printf '%s\n' "$_out" | grep -qF -- '-ffile-prefix-map='; then + fail "prefix_map_absent_when_unsupported: flag emitted despite unset args" + fi +} + +test_build_id_absent_when_unsupported() { + wrapper_environment + unset SPACK_BUILD_ID_ARGS + + _out=$(dump_args ld '') + if printf '%s\n' "$_out" | grep -qF -- '--build-id'; then + fail "build_id_absent_when_unsupported: flag emitted despite unset var" + fi + + _out=$(dump_args cc '') + if printf '%s\n' "$_out" | grep -qF -- '--build-id'; then + fail "build_id_absent_when_unsupported: flag emitted in ccld mode despite unset var" + fi +} + # --------------------------------------------------------------------------- # Runner # --------------------------------------------------------------------------- @@ -1537,6 +1646,10 @@ test_cpp_stays_cpp_with_x test_x_is_not_a_language_for_ld test_hip_always_flags test_x_hip_vcheck +test_prefix_map_injected +test_prefix_map_dedup +test_prefix_map_absent_when_unsupported +test_build_id_absent_when_unsupported ' all_tests="$wrapper_tests $list_ops_tests"