diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index 7f505b630612..724ccbefd790 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -473,7 +473,11 @@ FreeBSD::getDefaultUnwindTableLevel(const ArgList &Args) const { } bool FreeBSD::isPIEDefault(const llvm::opt::ArgList &Args) const { - return getSanitizerArgs(Args).requiresPIE(); + // The FreeBSD base system builds with PIE by default since 13.1. + VersionTuple OSVersion = getTriple().getOSVersion(); + if (OSVersion.getMajor() != 0 && OSVersion < VersionTuple(13, 1)) + return getSanitizerArgs(Args).requiresPIE(); + return true; } SanitizerMask diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c index 04157b462eb0..19b8b7c1cbdf 100644 --- a/clang/test/Driver/freebsd.c +++ b/clang/test/Driver/freebsd.c @@ -1,20 +1,40 @@ -// RUN: %clang -### --target=aarch64-pc-freebsd11 %s --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | \ -// RUN: FileCheck --check-prefix=CHECK-ARM64 %s +/// PIE is the default on FreeBSD >= 13.1 (and unversioned triples); earlier +/// releases default to non-PIE. +// RUN: %clang --target=aarch64-pc-freebsd14 %s --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ARM64-PIE %s + +// RUN: %clang --target=aarch64-pc-freebsd11 %s --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ARM64 %s // CHECK-ARM64: "-cc1" "-triple" "aarch64-pc-freebsd11" // CHECK-ARM64: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" // CHECK-ARM64: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtend.o" "{{.*}}crtn.o" -// RUN: %clang -### --target=powerpc-pc-freebsd12 %s --sysroot=%S/Inputs/basic_freebsd_tree 2>&1 | \ -// RUN: FileCheck --check-prefix=CHECK-PPC %s -// CHECK-PPC: "-cc1" "-triple" "powerpc-pc-freebsd12" -// CHECK-PPC: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" -// CHECK-PPC: "--eh-frame-hdr" "-m" "elf32ppc_fbsd" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtend.o" "{{.*}}crtn.o" +// CHECK-ARM64-PIE: "-cc1" "-triple" "aarch64-pc-freebsd{{[0-9]+}}" +// CHECK-ARM64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-ARM64-PIE: "--eh-frame-hdr" "-pie" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbeginS.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtendS.o" "{{.*}}crtn.o" -// RUN: %clang -### --target=powerpc64-pc-freebsd12 %s --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | \ -// RUN: FileCheck --check-prefix=CHECK-PPC64 %s -// CHECK-PPC64: "-cc1" "-triple" "powerpc64-pc-freebsd12" +// RUN: %clang -pie --target=aarch64-pc-freebsd11 %s --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ARM64-PIE %s + +// RUN: %clang -no-pie --target=aarch64-pc-freebsd11 %s --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ARM64-NOPIE %s +// CHECK-ARM64-NOPIE: "-cc1" "-triple" "aarch64-pc-freebsd11" +// CHECK-ARM64-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-ARM64-NOPIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtend.o" "{{.*}}crtn.o" + +// RUN: %clang --target=powerpc-pc-freebsd %s --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-PPC %s + +// CHECK-PPC: "-cc1" "-triple" "powerpc-pc-freebsd" +// CHECK-PPC: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-PPC: "--eh-frame-hdr" "-m" "elf32ppc_fbsd" "-pie" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbeginS.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtendS.o" "{{.*}}crtn.o" + +// RUN: %clang --target=powerpc64-pc-freebsd %s --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-PPC64 %s + +// CHECK-PPC64: "-cc1" "-triple" "powerpc64-pc-freebsd" // CHECK-PPC64: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" -// CHECK-PPC64: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbegin.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtend.o" "{{.*}}crtn.o" +// CHECK-PPC64: "--eh-frame-hdr" "-pie" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" "-o" "a.out" "{{.*}}crt1.o" "{{.*}}crti.o" "{{.*}}crtbeginS.o" "-L[[SYSROOT]]/usr/lib" "{{.*}}.o" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "{{.*}}crtendS.o" "{{.*}}crtn.o" // RUN: %clang -### --target=powerpc64le-unknown-freebsd13 %s --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-PPC64LE %s @@ -139,6 +159,34 @@ // CHECK-PIE: Scrt1.o // CHECK-PIE: crtbeginS.o +// RUN: %clang --target=x86_64-pc-freebsd %s \ +// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NORMAL-PIE %s +// CHECK-NORMAL-PIE: Scrt1.o +// CHECK-NORMAL-PIE: crtbeginS.o + +// RUN: %clang --target=x86_64-pc-freebsd -no-pie %s \ +// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NORMAL-NOPIE %s +// CHECK-NORMAL-NOPIE: crt1.o +// CHECK-NORMAL-NOPIE: crtbegin.o + +/// PIE is the default on FreeBSD >= 13.1 and on unversioned triples. +// RUN: %clang -### --target=x86_64-unknown-freebsd %s 2>&1 \ +// RUN: | FileCheck --check-prefix=PIE2 %s +// RUN: %clang -### --target=x86_64-unknown-freebsd13.1 %s 2>&1 \ +// RUN: | FileCheck --check-prefix=PIE2 %s + +// PIE2: "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie" +// PIE2: "-pie" + +/// Releases before 13.1 default to non-PIE. +// RUN: %clang -### --target=x86_64-unknown-freebsd13.0 %s 2>&1 \ +// RUN: | FileCheck --check-prefix=PIE2-OLD %s + +// PIE2-OLD: "-mrelocation-model" "static" +// PIE2-OLD-NOT: "-pic-is-pie" +// PIE2-OLD-NOT: "-pie" // RUN: %clang -### --target=x86_64-pc-freebsd12 %s --sysroot=%S/Inputs/multiarch_freebsd64_tree 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-NORMAL %s // CHECK-NORMAL: crt1.o diff --git a/clang/test/Driver/hip-fpie-option-freebsd.hip b/clang/test/Driver/hip-fpie-option-freebsd.hip new file mode 100644 index 000000000000..a1a0a4531848 --- /dev/null +++ b/clang/test/Driver/hip-fpie-option-freebsd.hip @@ -0,0 +1,26 @@ +// -fPIC and -fPIE only affects host relocation model. +// device compilation always uses PIC. + +// RUN: %clang -### --target=x86_64-unknown-freebsd \ +// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIE %s + +// RUN: %clang -### --target=x86_64-unknown-freebsd \ +// RUN: -fgpu-rdc --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIE %s + +// RUN: %clang -### --target=x86_64-unknown-freebsd \ +// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: -fPIC \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIC %s + +// RUN: %clang -### --target=x86_64-unknown-freebsd \ +// RUN: -fgpu-rdc --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: -fPIC \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIC %s + +// DEV-DAG: {{".*clang.*".* "-triple" "amdgcn-amd-amdhsa".* "-mrelocation-model" "pic" "-pic-level" "[1|2]".* "-mframe-pointer=all"}} +// HOST-PIC-DAG: {{".*clang.*".* "-triple" "x86_64-unknown-freebsd".* "-mrelocation-model" "pic" "-pic-level" "2"}} +// HOST-PIC-NOT: "-pic-is-pie" +// HOST-PIE-DAG: {{".*clang.*".* "-triple" "x86_64-unknown-freebsd".* "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie"}} +// DEV-NOT: {{".*clang.*".* "-triple" "amdgcn-amd-amdhsa".* "-pic-is-pie"}} diff --git a/flang/test/Driver/linker-options.f90 b/flang/test/Driver/linker-options.f90 index 07f967b4bac5..b07c51452be1 100644 --- a/flang/test/Driver/linker-options.f90 +++ b/flang/test/Driver/linker-options.f90 @@ -24,11 +24,11 @@ ! RUN: %flang -target x86_64-pc-linux-gnu -no-pie -### %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=NO-PIE ! -! Ensure that "-pie" is passed to the linker. -! RUN: %flang -target i386-unknown-freebsd -pie -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=PIE -! RUN: %flang -target aarch64-pc-linux-gnu -pie -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=PIE +! Ensure that "-no-pie" suppresses "-pie". +! RUN: %flang -target i386-unknown-freebsd -no-pie -### %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=NO-PIE +! RUN: %flang -target aarch64-pc-linux-gnu -no-pie -### %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=NO-PIE ! ! On Musl Linux, PIE is enabled by default, but can be disabled. ! RUN: %flang -target x86_64-linux-musl -### %s 2>&1 \ @@ -58,21 +58,13 @@ ! RUN: %flang -target i386-pc-openbsd -pie -### %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=PIE ! -! On FreeBSD, -pie is not passed to the linker, but can be forced. +! On FreeBSD, -pie is passed to the linker by default, but can be disabled. ! RUN: %flang -target amd64-pc-freebsd -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=NO-PIE -! RUN: %flang -target i386-pc-freebsd -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=NO-PIE -! RUN: %flang -target aarch64-unknown-freebsd -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=NO-PIE -! RUN: %flang -target arm-unknown-freebsd -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=NO-PIE -! RUN: %flang -target powerpc-unknown-freebsd -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=NO-PIE -! RUN: %flang -target sparc64-unknown-freebsd -### %s 2>&1 \ -! RUN: | FileCheck %s --check-prefix=NO-PIE -! RUN: %flang -target i386-pc-freebsd -pie -### %s 2>&1 \ ! RUN: | FileCheck %s --check-prefix=PIE +! RUN: %flang -target aarch64-unknown-freebsd -### %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=PIE +! RUN: %flang -target amd64-pc-freebsd -no-pie -### %s 2>&1 \ +! RUN: | FileCheck %s --check-prefix=NO-PIE ! ! On AIX, -pie is never passed to the linker. ! RUN: %flang -target powerpc64-unknown-aix -### %s 2>&1 \