
This patch supports GNU ld on Solaris in addition to Solaris ld, the default. - Linker selection is dynamic: one can switch between Solaris ld and GNU ld at runtime, with the default selectable with `-DCLANG_DEFAULT_LINKER`. - Testcases have been adjusted to test both variants in case there are differences. - The `compiler-rt/cmake/config-ix.cmake` and `llvm/cmake/modules/AddLLVM.cmake` changes to restrict the tests to Solaris ld are necessary because GNU accepts unknown `-z` options, but warns every time they are used, creating a lot of noise. Since there seems to be no way to check for those warnings in `llvm_check_compiler_linker_flag` or `llvm_check_compiler_linker_flag`, I restrict the cmake tests to Solaris ld in the first place. - The changes to `clang/test/Driver/hip-link-bundle-archive.hip` and `flang/test/Driver/linker-flags.f90` are required when LLVM is built with `-DCLANG_DEFAULT_LINKER=gld` on Solaris: `MSVC.cpp` `visualstudio::Linker::ConstructJob` ultimately calls `GetProgramPath("gld")`, resulting in a search for `gld`, which exists in `/usr/bin/gld` on Solaris. With `-fuse-ld=`, this doesn't happen and the expected `link` is returned. - `compiler-rt/test/asan/TestCases/global-location-nodebug.cpp` needs to enforce the Solaris ld, otherwise the test would `XPASS` with GNU ld which has the `-S` semantics expected by the test. Tested on `amd64-pc-solaris2.11` and `sparcv9-sun-solaris2.11` with both `-DCLANG_DEFAULT_LINKER=gld` and the default, and `x86_64-pc-linux-gnu`. No regressions in either case. Differential Revision: https://reviews.llvm.org/D85309
247 lines
12 KiB
C
247 lines
12 KiB
C
// General tests that ld invocations on Solaris targets sane. Note that we use
|
|
// sysroot to make these tests independent of the host system.
|
|
|
|
// Check sparc-sun-solaris2.11, 32bit
|
|
// RUN: %clang -### %s --target=sparc-sun-solaris2.11 -fuse-ld= \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefixes=CHECK-LD-SPARC32,CHECK-LD %s
|
|
// RUN: %clang -### %s --target=sparc-sun-solaris2.11 -fuse-ld=gld \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefixes=CHECK-LD-SPARC32,CHECK-GLD %s
|
|
// CHECK-LD-SPARC32-NOT: warning:
|
|
// CHECK-LD-SPARC32: "-cc1" "-triple" "sparc-sun-solaris2.11"
|
|
// CHECK-LD-SPARC32-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-LD-SPARC32: "{{.*}}ld{{(.exe)?}}"
|
|
// CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2{{/|\\\\}}crt1.o"
|
|
// CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o"
|
|
// CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2{{/|\\\\}}crtbegin.o"
|
|
// CHECK-LD-SPARC32-SAME: "-L[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2"
|
|
// CHECK-LD-SPARC32-SAME: "-L[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/../../.."
|
|
// CHECK-LD-SPARC32-SAME: "-L[[SYSROOT]]/usr/lib"
|
|
// CHECK-LD: "-z" "ignore" "-latomic" "-z" "record"
|
|
// CHECK-GLD: "--as-needed" "-latomic" "--no-as-needed"
|
|
// CHECK-LD-SPARC32-SAME: "-lgcc_s"
|
|
// CHECK-LD-SPARC32-SAME: "-lc"
|
|
// CHECK-LD-SPARC32-SAME: "-lgcc"
|
|
// CHECK-LD-SPARC32-SAME: "-lm"
|
|
// CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2{{/|\\\\}}crtend.o"
|
|
// CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crtn.o"
|
|
|
|
// Check sparc-sun-solaris2.11, 64bit
|
|
// RUN: %clang -m64 -### %s 2>&1 --target=sparc-sun-solaris2.11 \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \
|
|
// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC64 %s
|
|
// CHECK-LD-SPARC64-NOT: warning:
|
|
// CHECK-LD-SPARC64: "-cc1" "-triple" "sparcv9-sun-solaris2.11"
|
|
// CHECK-LD-SPARC64-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-LD-SPARC64: "{{.*}}ld{{(.exe)?}}"
|
|
// CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/sparcv9{{/|\\\\}}crt1.o"
|
|
// CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/lib/sparcv9{{/|\\\\}}crti.o"
|
|
// CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/sparcv9{{/|\\\\}}crtbegin.o"
|
|
// CHECK-LD-SPARC64-SAME: "-L[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/sparcv9"
|
|
// CHECK-LD-SPARC64-SAME: "-L[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/../../../sparcv9"
|
|
// CHECK-LD-SPARC64-SAME: "-L[[SYSROOT]]/usr/lib/sparcv9"
|
|
// CHECK-LD-SPARC64-NOT: "-latomic"
|
|
// CHECK-LD-SPARC64-SAME: "-lgcc_s"
|
|
// CHECK-LD-SPARC64-SAME: "-lc"
|
|
// CHECK-LD-SPARC64-SAME: "-lgcc"
|
|
// CHECK-LD-SPARC64-SAME: "-lm"
|
|
// CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/sparcv9{{/|\\\\}}crtend.o"
|
|
// CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/lib/sparcv9{{/|\\\\}}crtn.o"
|
|
|
|
// Check i386-pc-solaris2.11, 32bit
|
|
// RUN: %clang -### %s 2>&1 --target=i386-pc-solaris2.11 \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_x86_tree \
|
|
// RUN: | FileCheck --check-prefix=CHECK-LD-X32 %s
|
|
// CHECK-LD-X32-NOT: warning:
|
|
// CHECK-LD-X32: "-cc1" "-triple" "i386-pc-solaris2.11"
|
|
// CHECK-LD-X32-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-LD-X32: "{{.*}}ld{{(.exe)?}}"
|
|
// CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt1.o"
|
|
// CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o"
|
|
// CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4{{/|\\\\}}crtbegin.o"
|
|
// CHECK-LD-X32-SAME: "-L[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4"
|
|
// CHECK-LD-X32-SAME: "-L[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/../../.."
|
|
// CHECK-LD-X32-SAME: "-L[[SYSROOT]]/usr/lib"
|
|
// CHECK-LD-X32-NOT: "-latomic"
|
|
// CHECK-LD-X32-SAME: "-lgcc_s"
|
|
// CHECK-LD-X32-SAME: "-lc"
|
|
// CHECK-LD-X32-SAME: "-lgcc"
|
|
// CHECK-LD-X32-SAME: "-lm"
|
|
// CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4{{/|\\\\}}crtend.o"
|
|
// CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crtn.o"
|
|
|
|
// Check i386-pc-solaris2.11, 64bit
|
|
// RUN: %clang -m64 -### %s 2>&1 \
|
|
// RUN: --target=i386-pc-solaris2.11 \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_x86_tree \
|
|
// RUN: | FileCheck --check-prefix=CHECK-LD-X64 %s
|
|
// CHECK-LD-X64-NOT: warning:
|
|
// CHECK-LD-X64: "-cc1" "-triple" "x86_64-pc-solaris2.11"
|
|
// CHECK-LD-X64-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-LD-X64: "{{.*}}ld{{(.exe)?}}"
|
|
// CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/lib/amd64{{/|\\\\}}crt1.o"
|
|
// CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/lib/amd64{{/|\\\\}}crti.o"
|
|
// CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/amd64{{/|\\\\}}crtbegin.o"
|
|
// CHECK-LD-X64-SAME: "-L[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/amd64"
|
|
// CHECK-LD-X64-SAME: "-L[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/../../../amd64"
|
|
// CHECK-LD-X64-SAME: "-L[[SYSROOT]]/usr/lib/amd64"
|
|
// CHECK-LD-X64-NOT: "-latomic"
|
|
// CHECK-LD-X64-SAME: "-lgcc_s"
|
|
// CHECK-LD-X64-SAME: "-lc"
|
|
// CHECK-LD-X64-SAME: "-lgcc"
|
|
// CHECK-LD-X64-SAME: "-lm"
|
|
// CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/amd64{{/|\\\\}}crtend.o"
|
|
// CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/lib/amd64{{/|\\\\}}crtn.o"
|
|
|
|
// Check the right -l flags are present with -shared
|
|
// RUN: %clang -### %s -shared 2>&1 \
|
|
// RUN: --target=sparc-sun-solaris2.11 \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \
|
|
// RUN: | FileCheck --check-prefix=CHECK-SPARC32-SHARED %s
|
|
// CHECK-SPARC32-SHARED: "{{.*}}ld{{(.exe)?}}"
|
|
// CHECK-SPARC32-SHARED-SAME: "-lgcc_s"
|
|
// CHECK-SPARC32-SHARED-SAME: "-lc"
|
|
// CHECK-SPARC32-SHARED-NOT: "-lgcc"
|
|
// CHECK-SPARC32-SHARED-NOT: "-lm"
|
|
|
|
// Check the right ld flags are present with -pie.
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -pie -fuse-ld= \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-PIE-LD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -pie -fuse-ld=gld \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-PIE-GLD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -nopie -fuse-ld= \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-LD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -nopie -fuse-ld=gld \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-GLD %s
|
|
|
|
// Check that -shared/-r/-static disable PIE.
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -shared -pie -fuse-ld= \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-LD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -shared -pie -fuse-ld=gld \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-GLD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -r -pie -fuse-ld= \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-LD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -r -pie -fuse-ld=gld \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-GLD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -static -pie -fuse-ld= \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-LD %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -static -pie -fuse-ld=gld \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOPIE-GLD %s
|
|
|
|
// CHECK-PIE-LD: "-z" "type=pie"
|
|
// CHECK-PIE-GLD: "-pie"
|
|
// CHECK-NOPIE-LD-NOT: "-z" "type=pie"
|
|
// CHECK-NOPIE-GLD-NOT: "-pie"
|
|
|
|
// -r suppresses default -l and crt*.o, values-*.o like -nostdlib.
|
|
// RUN: %clang -### %s --target=sparc-sun-solaris2.11 -r 2>&1 \
|
|
// RUN: | FileCheck %s --check-prefix=CHECK-RELOCATABLE
|
|
// CHECK-RELOCATABLE: "-L
|
|
// CHECK-RELOCATABLE: "-r"
|
|
// CHECK-RELOCATABLE-NOT: "-l
|
|
// CHECK-RELOCATABLE-NOT: /crt{{[^.]+}}.o
|
|
// CHECK-RELOCATABLE-NOT: /values-{{[^.]+}}.o
|
|
|
|
// Check that crt{begin,end}S.o is linked with -shared/-pie.
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOCRTS %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -shared \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-CRTS %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -nopie \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOCRTS %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -pie \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-CRTS %s
|
|
// CHECK-CRTS: crtbeginS.o
|
|
// CHECK-CRTS: crtendS.o
|
|
// CHECK-NOCRTS-NOT: crtbeginS.o
|
|
// CHECK-NOCRTS-NOT: crtendS.o
|
|
|
|
// Check that crtfastmath.o is linked with -ffast-math.
|
|
|
|
// Check sparc-sun-solaris2.11, 32bit
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH-SPARC32 %s
|
|
// RUN: %clang --target=sparc-sun-solaris2.11 -### %s -ffast-math \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH-SPARC32 %s
|
|
// CHECK-CRTFASTMATH-SPARC32: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-CRTFASTMATH-SPARC32: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2{{/|\\\\}}crtfastmath.o"
|
|
// CHECK-NOCRTFASTMATH-SPARC32-NOT: crtfastmath.o
|
|
|
|
// Check sparc-pc-solaris2.11, 64bit
|
|
// RUN: %clang -m64 --target=sparc-sun-solaris2.11 -### %s \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH-SPARC64 %s
|
|
// RUN: %clang -m64 --target=sparc-sun-solaris2.11 -### %s -ffast-math \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH-SPARC64 %s
|
|
// CHECK-CRTFASTMATH-SPARC64: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-CRTFASTMATH-SPARC64: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/sparcv9{{/|\\\\}}crtfastmath.o"
|
|
// CHECK-NOCRTFASTMATH-SPARC64-NOT: crtfastmath.o
|
|
|
|
// Check i386-pc-solaris2.11, 32bit
|
|
// RUN: %clang --target=i386-pc-solaris2.11 -### %s \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_x86_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH-X32 %s
|
|
// RUN: %clang --target=i386-pc-solaris2.11 -### %s -ffast-math \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_x86_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH-X32 %s
|
|
// CHECK-CRTFASTMATH-X32: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-CRTFASTMATH-X32: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4{{/|\\\\}}crtfastmath.o"
|
|
// CHECK-NOCRTFASTMATH-X32-NOT: crtfastmath.o
|
|
|
|
// Check i386-pc-solaris2.11, 64bit
|
|
// RUN: %clang -m64 --target=i386-pc-solaris2.11 -### %s \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_x86_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-NOCRTFASTMATH-X64 %s
|
|
// RUN: %clang -m64 --target=i386-pc-solaris2.11 -### %s -ffast-math \
|
|
// RUN: --gcc-toolchain="" \
|
|
// RUN: --sysroot=%S/Inputs/solaris_x86_tree 2>&1 \
|
|
// RUN: | FileCheck --check-prefix=CHECK-CRTFASTMATH-X64 %s
|
|
// CHECK-CRTFASTMATH-X64: "-isysroot" "[[SYSROOT:[^"]+]]"
|
|
// CHECK-CRTFASTMATH-X64: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/amd64{{/|\\\\}}crtfastmath.o"
|
|
// CHECK-NOCRTFASTMATH-X64-NOT: crtfastmath.o
|