[flang-commits] [flang] e6190fa - [clang] Switch to Default PIE on FreeBSD (#206139)

via flang-commits flang-commits at lists.llvm.org
Tue Jul 21 20:26:41 PDT 2026


Author: aokblast
Date: 2026-07-22T11:26:36+08:00
New Revision: e6190fab2e05e4ba8646af9cf32314fd75e6cccd

URL: https://github.com/llvm/llvm-project/commit/e6190fab2e05e4ba8646af9cf32314fd75e6cccd
DIFF: https://github.com/llvm/llvm-project/commit/e6190fab2e05e4ba8646af9cf32314fd75e6cccd.diff

LOG: [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.

Added: 
    clang/test/Driver/hip-fpie-option-freebsd.hip

Modified: 
    clang/lib/Driver/ToolChains/FreeBSD.cpp
    clang/test/Driver/freebsd.c
    flang/test/Driver/linker-options.f90

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index 7f505b6306128..724ccbefd790f 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 04157b462eb0f..19b8b7c1cbdf7 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-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 -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" "-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-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
 
-// 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"
+// 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 0000000000000..a1a0a45318481
--- /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 07f967b4bac5d..b07c51452be1b 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:   | FileCheck %s --check-prefix=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 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 \


        


More information about the flang-commits mailing list