[clang] Switch to Default PIE on FreeBSD (#206139)

We have started to compile the binary in our base as PIE by defualt. It
makes sense to compile the binary to PIE by default in toolchain as
Linux now. Also, extended testcases to support default PIE and no-pie
parameter in freebsd.c and hip-fpie-option.hip.
This commit is contained in:
aokblast 2026-07-22 11:26:36 +08:00 committed by GitHub
parent 46858d55e8
commit e6190fab2e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 100 additions and 30 deletions

View file

@ -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

View file

@ -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

View file

@ -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"}}

View file

@ -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 \