blob: db734e3cbaf717672c7c74fbfa427274805cefab [file] [edit]
// UNSUPPORTED: system-windows
/// Check default header and linker paths for each supported triple.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: 2>&1 | FileCheck %s --check-prefix=PATHS
// RUN: %clang -### %s --target=aarch64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: 2>&1 | FileCheck %s --check-prefix=PATHS
// RUN: %clang -### %s --target=riscv64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: 2>&1 | FileCheck %s --check-prefix=PATHS
// PATHS: "-resource-dir" "[[RESOURCE:[^"]+]]"
// PATHS-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
// PATHS-SAME: "-internal-isystem" "[[RESOURCE]]/include"
// PATHS-SAME: "-internal-isystem" "[[SYSROOT]]/usr/include"
// PATHS: "-L[[SYSROOT]]/usr/lib"
/// Check include paths with -nostdinc.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: -fsyntax-only -nostdinc 2>&1 | FileCheck %s --check-prefix=PATH_NOSTDINC
// PATH_NOSTDINC: "-nostdsysteminc" "-nobuiltininc"
// PATH_NOSTDINC-NOT: /include
/// Check include paths with -nobuiltininc.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: -fsyntax-only -nobuiltininc 2>&1 | FileCheck %s --check-prefix=PATH_NOBUILTIN
// PATH_NOBUILTIN: "-nobuiltininc"
// PATH_NOBUILTIN-SAME: "-resource-dir" "[[RESOURCE:[^"]+]]"
// PATH_NOBUILTIN-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
// PATH_NOBUILTIN-NOT: "-internal-isystem" "[[RESOURCE]]/include"
// PATH_NOBUILTIN-SAME: "-internal-isystem" "[[SYSROOT]]/usr/include"
/// Check include paths with -nostdlibinc.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: -fsyntax-only -nostdlibinc 2>&1 | FileCheck %s --check-prefix=PATH_NOSTDLIBINC
// PATH_NOSTDLIBINC: "-nostdsysteminc"
// PATH_NOSTDLIBINC-SAME: "-resource-dir" "[[RESOURCE:[^"]+]]"
// PATH_NOSTDLIBINC-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
// PATH_NOSTDLIBINC-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
// PATH_NOSTDLIBINC-SAME: "-internal-isystem" "[[RESOURCE]]/include"
// PATH_NOSTDLIBINC-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include"
/// Check that PIC and PIE are enabled by default.
// RUN: %clang -c %s --target=x86_64-unkown-serenity -### 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-PIE2
// RUN: %clang -c %s --target=aarch64-unkown-serenity -### 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-PIE2
// RUN: %clang -c %s --target=riscv64-unkown-serenity -### 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-PIE2
// CHECK-PIE2: "-mrelocation-model" "pic"
// CHECK-PIE2-SAME: "-pic-level" "2"
// CHECK-PIE2-SAME: "-pic-is-pie"
/// Check default linker args for each supported triple.
// RUN: %clang -### %s --target=x86_64-unknown-serenity \
// RUN: --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: 2>&1 | FileCheck %s --check-prefix=SERENITY_X86_64,DEFAULT_LINKER
// SERENITY_X86_64: "-cc1" "-triple" "[[TRIPLE:x86_64-unknown-serenity]]"
// RUN: %clang -### %s --target=aarch64-unknown-serenity \
// RUN: --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: 2>&1 | FileCheck %s --check-prefix=SERENITY_AARCH64,DEFAULT_LINKER
// SERENITY_AARCH64: "-cc1" "-triple" "[[TRIPLE:aarch64-unknown-serenity]]"
// RUN: %clang -### %s --target=riscv64-unknown-serenity \
// RUN: --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: 2>&1 | FileCheck %s --check-prefix=SERENITY_RISCV64,DEFAULT_LINKER
// SERENITY_RISCV64: "-cc1" "-triple" "[[TRIPLE:riscv64-unknown-serenity]]"
// DEFAULT_LINKER: "-isysroot" "[[SYSROOT:[^"]+]]"
// DEFAULT_LINKER: ld.lld"
// DEFAULT_LINKER-SAME: "-pie"
// DEFAULT_LINKER-SAME: "-dynamic-linker" "/usr/lib/Loader.so" "--eh-frame-hdr"
// DEFAULT_LINKER-SAME: "-o" "a.out"
// DEFAULT_LINKER-SAME: "-z" "pack-relative-relocs"
// DEFAULT_LINKER-SAME: "[[SYSROOT]]/usr/lib/crt0.o"
// DEFAULT_LINKER-SAME: "[[RESOURCE:[^"]+]]/lib/[[TRIPLE]]/clang_rt.crtbegin.o"
// DEFAULT_LINKER-SAME: "[[RESOURCE]]/lib/[[TRIPLE]]/libclang_rt.builtins.a"
// DEFAULT_LINKER-SAME: "-lc" "[[RESOURCE]]/lib/[[TRIPLE]]/clang_rt.crtend.o"
/// Check if the sysroot is passed to the linker.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=TestSysroot \
// RUN: -static-pie 2>&1 | FileCheck %s --check-prefix=LINKER_SYSROOT
// LINKER_SYSROOT: ld.lld"
// LINKER_SYSROOT-SAME: "--sysroot=TestSysroot"
/// Check that we find crt*.o files in the sysroot, use -static-pie to
/// be able to check for crtbeginS.o and crtendS.o too.
// RUN: %clang -### %s --target=x86_64-unknown-serenity \
// RUN: --sysroot=%S/Inputs/serenity_tree \
// RUN: -static-pie 2>&1 | FileCheck %s --check-prefix=CRT_SYSROOT
// CRT_SYSROOT: "-isysroot" "[[SYSROOT:[^"]+]]"
// CRT_SYSROOT: "[[SYSROOT]]/usr/lib/crt0.o"
// CRT_SYSROOT-SAME: "[[SYSROOT]]/usr/lib/crtbeginS.o"
// CRT_SYSROOT-SAME: "[[SYSROOT]]/usr/lib/crtendS.o"
/// -static-pie suppresses -dynamic-linker.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -static-pie 2>&1 | FileCheck %s --check-prefix=STATIC_PIE
// STATIC_PIE: "-static" "-pie"
// STATIC_PIE-NOT: "-dynamic-linker"
// STATIC_PIE-SAME: "--no-dynamic-linker" "-z" "text"
// STATIC_PIE-SAME: "--eh-frame-hdr"
// STATIC_PIE-SAME: "-z" "pack-relative-relocs"
// STATIC_PIE-SAME: "crt0.o" "crtbeginS.o"
// STATIC_PIE-SAME: "-lc" "crtendS.o"
/// -shared forces use of shared crt files.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -shared 2>&1 | FileCheck %s --check-prefix=SHARED
// SHARED: "-shared"
// SHARED-SAME: "--eh-frame-hdr"
// SHARED-SAME: "-z" "pack-relative-relocs"
// SHARED-NOT: "crt0.o"
// SHARED-SAME: "crtbeginS.o"
// SHARED-SAME: "-lc" "crtendS.o"
/// -static forces use of static crt files.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -static 2>&1 | FileCheck %s --check-prefix=STATIC
// STATIC: "-static"
// STATIC-SAME: "--eh-frame-hdr"
// STATIC-SAME: "-z" "pack-relative-relocs"
// STATIC-SAME: "crt0.o" "crtbeginS.o"
// STATIC-SAME: "-lc" "crtendS.o"
/// -rdynamic passes -export-dynamic.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -rdynamic 2>&1 | FileCheck %s --check-prefix=RDYNAMIC,RDYNAMIC_SHARED
// RDYNAMIC: "-export-dynamic" "-pie"
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -no-pie -rdynamic 2>&1 | FileCheck %s --check-prefix=RDYNAMIC_NOPIE,RDYNAMIC_SHARED
// RDYNAMIC_NOPIE: "-export-dynamic"
// RDYNAMIC_NOPIE-NOT: "-pie"
// RDYNAMIC_SHARED-SAME: "-dynamic-linker" "/usr/lib/Loader.so" "--eh-frame-hdr"
// RDYNAMIC_SHARED-SAME: "-o" "a.out"
// RDYNAMIC_SHARED-SAME: "-z" "pack-relative-relocs"
// RDYNAMIC_SHARED-SAME: "crt0.o" "crtbeginS.o"
// RDYNAMIC_SHARED-SAME: "-lc" "crtendS.o"
/// -nostdlib suppresses default -l and crt*.o.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir= -nostdlib --rtlib=compiler-rt \
// RUN: 2>&1 | FileCheck %s --check-prefix=NOSTDLIB
// NOSTDLIB: "-isysroot" "[[SYSROOT:[^"]+]]"
// NOSTDLIB-NOT: crt{{[^./]+}}.o
// NOSTDLIB: "-L
// NOSTDLIB-SAME: {{^}}[[SYSROOT]]/usr/lib"
// NOSTDLIB-NOT: "-l
// NOSTDLIB-NOT: libclang_rt.builtins
// NOSTDLIB-NOT: crt{{[^./]+}}.o
/// -nostartfiles suppresses crt*.o, but not default -l.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir -nostartfiles --rtlib=compiler-rt \
// RUN: 2>&1 | FileCheck %s --check-prefix=NOSTARTFILES
// NOSTARTFILES: "-isysroot" "[[SYSROOT:[^"]+]]"
// NOSTARTFILES-SAME: {{^}}
// NOSTARTFILES-NOT: crt{{[^./]+}}.o
// NOSTARTFILES: "-L
// NOSTARTFILES-SAME: {{^}}[[SYSROOT]]/usr/lib"
// NOSTARTFILES: lib/x86_64-unknown-serenity/libclang_rt.builtins.a"
// NOSTARTFILES: "-lc"
// NOSTARTFILES-NOT: crt{{[^./]+}}.o
/// -r suppresses -dynamic-linker, default -l, and crt*.o like -nostdlib.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir -r --rtlib=compiler-rt \
// RUN: 2>&1 | FileCheck %s --check-prefix=RELOCATABLE
// RELOCATABLE-NOT: "-dynamic-linker"
// RELOCATABLE: "-isysroot" "[[SYSROOT:[^"]+]]"
// RELOCATABLE: "-internal-isystem"
// RELOCATABLE-NOT: crt{{[^./]+}}.o
// RELOCATABLE: "-L
// RELOCATABLE-SAME: {{^}}[[SYSROOT]]/usr/lib"
// RELOCATABLE-NOT: "-l
// RELOCATABLE-NOT: crt{{[^./]+}}.o
// RELOCATABLE-NOT: libclang_rt.builtins
/// -nolibc suppresses -lc but not other default -l.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir -nolibc --rtlib=compiler-rt \
// RUN: 2>&1 | FileCheck %s --check-prefix=NOLIBC
// NOLIBC: "-isysroot" "[[SYSROOT:[^"]+]]"
// NOLIBC: "-internal-isystem"
// NOLIBC: "[[SYSROOT]]/usr/lib/crt0.o" "[[SYSROOT]]/usr/lib/crtbeginS.o"
// NOLIBC: "-L
// NOLIBC-SAME: {{^}}[[SYSROOT]]/usr/lib"
// NOLIBC-NOT: "-lc"
// NOLIBC: "[[RESOURCE:[^"]+]]/lib/x86_64-unknown-serenity/libclang_rt.builtins.a"
// NOLIBC: "[[SYSROOT]]/usr/lib/crtendS.o"
/// -fsanitize=undefined redirects to Serenity-custom UBSAN runtime.
// RUN: %clang -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/serenity_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir -fsanitize=undefined --rtlib=compiler-rt \
// RUN: 2>&1 | FileCheck %s --check-prefix=UBSAN
// UBSAN-NOT: "libclang_rt.ubsan"
// UBSAN: "-lubsan"
/// Support for KASAN.
// RUN: %clang -target x86_64-unknown-serenity -fsanitize=kernel-address -### %s \
// RUN: 2>&1 | FileCheck %s --check-prefix=KASAN
// KASAN: "-fsanitize=kernel-address"
// KASAN-SAME: "-fsanitize-recover=kernel-address"
/// Check C++ stdlib behavior.
// RUN: %clangxx -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: 2>&1 | FileCheck %s --check-prefix=DEFAULT_LIBCXX
// DEFAULT_LIBCXX: "-dynamic-linker" "/usr/lib/Loader.so" "--eh-frame-hdr"
// DEFAULT_LIBCXX: "-z" "pack-relative-relocs"
// DEFAULT_LIBCXX: "crt0.o" "crtbeginS.o"
// DEFAULT_LIBCXX: "--push-state"
// DEFAULT_LIBCXX: "--as-needed"
// DEFAULT_LIBCXX: "-lc++"
// DEFAULT_LIBCXX: "--pop-state"
// DEFAULT_LIBCXX: "-lc" "crtendS.o"
// RUN: %clangxx -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -static 2>&1 | FileCheck %s --check-prefix=STATIC_LIBCXX
// STATIC_LIBCXX: "-z" "pack-relative-relocs"
// STATIC_LIBCXX: "crt0.o" "crtbeginS.o"
// STATIC_LIBCXX: "--push-state"
// STATIC_LIBCXX: "--as-needed"
// STATIC_LIBCXX: "-lc++"
// STATIC_LIBCXX: "--pop-state"
// STATIC_LIBCXX: "-lc" "crtendS.o"
// RUN: %clangxx -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -static-libstdc++ 2>&1 | FileCheck %s --check-prefix=STATIC_LIBSTDCXX
// STATIC_LIBSTDCXX: "-z" "pack-relative-relocs"
// STATIC_LIBSTDCXX: "crt0.o" "crtbeginS.o"
// STATIC_LIBSTDCXX: "--push-state"
// STATIC_LIBSTDCXX: "--as-needed"
// STATIC_LIBSTDCXX: "-Bstatic"
// STATIC_LIBSTDCXX: "-lc++"
// STATIC_LIBSTDCXX: "-Bdynamic"
// STATIC_LIBSTDCXX: "--pop-state"
// STATIC_LIBSTDCXX: "-lc" "crtendS.o"
// RUN: %clangxx -### %s --target=x86_64-unknown-serenity --sysroot=%S/Inputs/empty_tree \
// RUN: -nostdlib++ 2>&1 | FileCheck %s --check-prefix=NO_LIBCXX
// NO_LIBCXX: "-z" "pack-relative-relocs"
// NO_LIBCXX: "crt0.o" "crtbeginS.o"
// NO_LIBCXX-NOT: "-lc++"
// NO_LIBCXX-SAME: "-lc" "crtendS.o"
/// Check that unwind tables are enabled.
// RUN: %clang --target=x86_64-unknown-serenity -### -S %s 2>&1 | \
// RUN: FileCheck -check-prefix=UNWIND-TABLES %s
// RUN: %clang --target=aarch64-unknown-serenity -### -S %s 2>&1 | \
// RUN: FileCheck -check-prefix=UNWIND-TABLES %s
// RUN: %clang --target=riscv64-unknown-serenity -### -S %s 2>&1 | \
// RUN: FileCheck -check-prefix=UNWIND-TABLES %s
// UNWIND-TABLES: "-funwind-tables=2"
/// Check that parameters are forwarded to the linker.
// RUN: %clang --target=x86_64-unknown-serenity -### %s -L/foo -u bar -T script.ld -s -t -r 2>&1 \
// RUN: | FileCheck %s --check-prefix=LINK
// LINK: ld.lld"
// LINK-SAME: "-L/foo"
// LINK-SAME: "-u" "bar"
// LINK-SAME: "-T" "script.ld"
// LINK-SAME: "-s"
// LINK-SAME: "-t"
// LINK-SAME: "-r"
// RUN: %clang --target=x86_64-unknown-serenity -### %s -Wl,--compress-debug-sections=zlib 2>&1 \
// RUN: | FileCheck %s --check-prefix=COMPRESS
// COMPRESS: ld.lld"
// COMPRESS: "--compress-debug-sections=zlib"
/// Check LTO.
// RUN: %clang --target=x86_64-unknown-serenity -flto %s -### 2>&1 \
// RUN: | FileCheck %s --check-prefix=LTO_FULL
// LTO_FULL: "-plugin-opt=
// LTO_FULL-NOT: "-plugin-opt=thinlto"
// RUN: %clang --target=x86_64-unknown-serenity -flto=thin %s -### 2>&1 \
// RUN: | FileCheck %s --check-prefix=LTO_THIN
// LTO_THIN: "-plugin-opt=thinlto"