https://github.com/aokblast updated 
https://github.com/llvm/llvm-project/pull/206139

>From e27fa2c5bb6c91881208c057800c332c391ff1b5 Mon Sep 17 00:00:00 2001
From: ShengYi Hung <[email protected]>
Date: Fri, 10 Jul 2026 16:07:46 +0800
Subject: [PATCH 1/4] [Clang] Switch to Default PIE on FreeBSD

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-pie.c, freebsd-mips-as-pie.c and 
hip-fpie-option-freebsd.hip.
---
 clang/CMakeLists.txt                          |   2 +
 clang/include/clang/Config/config.h.cmake     |   3 +
 clang/lib/Driver/ToolChains/FreeBSD.cpp       |   7 +-
 clang/test/CMakeLists.txt                     |   1 +
 clang/test/Driver/freebsd-default-pie.c       |   7 +
 clang/test/Driver/freebsd-mips-as-pie.c       |  94 ++++++
 clang/test/Driver/freebsd-mips-as.c           |   2 +
 clang/test/Driver/freebsd-pie.c               | 275 ++++++++++++++++++
 clang/test/Driver/freebsd.c                   |   2 +
 clang/test/Driver/hie-fpie-option-freebsd.hip |  38 +++
 clang/test/lit.cfg.py                         |   3 +
 clang/test/lit.site.cfg.py.in                 |   1 +
 flang/test/Driver/linker-options.f90          |  22 +-
 flang/test/Driver/pic-flags.f90               |   1 +
 .../clang/include/clang/Config/BUILD.gn       |   1 +
 llvm/utils/gn/secondary/clang/test/BUILD.gn   |   1 +
 .../clang/include/clang/Config/config.h       |   3 +
 17 files changed, 448 insertions(+), 15 deletions(-)
 create mode 100644 clang/test/Driver/freebsd-default-pie.c
 create mode 100644 clang/test/Driver/freebsd-mips-as-pie.c
 create mode 100644 clang/test/Driver/freebsd-pie.c
 create mode 100644 clang/test/Driver/hie-fpie-option-freebsd.hip

diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt
index 20276a034d50a..7617e21157903 100644
--- a/clang/CMakeLists.txt
+++ b/clang/CMakeLists.txt
@@ -286,6 +286,8 @@ set(PPC_LINUX_DEFAULT_IEEELONGDOUBLE OFF CACHE BOOL
 set(CLANG_SPAWN_CC1 OFF CACHE BOOL
     "Whether clang should use a new process for the CC1 invocation")
 
+option(CLANG_DEFAULT_PIE_ON_FREEBSD "Default to -fPIE and -pie on freebsd" ON)
+
 option(CLANG_DEFAULT_PIE_ON_LINUX "Default to -fPIE and -pie on linux-gnu" ON)
 
 set(CLANG_DEFAULT_LINKER "" CACHE STRING
diff --git a/clang/include/clang/Config/config.h.cmake 
b/clang/include/clang/Config/config.h.cmake
index 11b4096726f67..e92d449170908 100644
--- a/clang/include/clang/Config/config.h.cmake
+++ b/clang/include/clang/Config/config.h.cmake
@@ -8,6 +8,9 @@
 /* Bug report URL. */
 #define BUG_REPORT_URL "${BUG_REPORT_URL}"
 
+/* Default to -fPIE and -pie on FreeBSD. */
+#cmakedefine01 CLANG_DEFAULT_PIE_ON_FREEBSD
+
 /* Default to -fPIE and -pie on Linux. */
 #cmakedefine01 CLANG_DEFAULT_PIE_ON_LINUX
 
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp 
b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index c45ae14f4e643..638a28bf4d60e 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -134,9 +134,8 @@ void freebsd::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   const Driver &D = ToolChain.getDriver();
   const llvm::Triple &Triple = ToolChain.getTriple();
   const llvm::Triple::ArchType Arch = ToolChain.getArch();
-  const bool IsPIE =
-      !Args.hasArg(options::OPT_shared) &&
-      (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault(Args));
+  const bool IsPIE = Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
+                                  ToolChain.isPIEDefault(Args));
   ArgStringList CmdArgs;
 
   // Silence warning for "clang -g foo.o -o foo"
@@ -473,7 +472,7 @@ FreeBSD::getDefaultUnwindTableLevel(const ArgList &Args) 
const {
 }
 
 bool FreeBSD::isPIEDefault(const llvm::opt::ArgList &Args) const {
-  return getSanitizerArgs(Args).requiresPIE();
+  return CLANG_DEFAULT_PIE_ON_FREEBSD || getSanitizerArgs(Args).requiresPIE();
 }
 
 SanitizerMask
diff --git a/clang/test/CMakeLists.txt b/clang/test/CMakeLists.txt
index 15170bbc2d1ed..d99b9a1e0602f 100644
--- a/clang/test/CMakeLists.txt
+++ b/clang/test/CMakeLists.txt
@@ -5,6 +5,7 @@ llvm_canonicalize_cmake_booleans(
   BUILD_SHARED_LIBS
   CLANG_BUILD_EXAMPLES
   CLANG_BUILT_STANDALONE
+  CLANG_DEFAULT_PIE_ON_FREEBSD
   CLANG_DEFAULT_PIE_ON_LINUX
   CLANG_ENABLE_STATIC_ANALYZER
   CLANG_PLUGIN_SUPPORT
diff --git a/clang/test/Driver/freebsd-default-pie.c 
b/clang/test/Driver/freebsd-default-pie.c
new file mode 100644
index 0000000000000..58e7b3a0b0efe
--- /dev/null
+++ b/clang/test/Driver/freebsd-default-pie.c
@@ -0,0 +1,7 @@
+// REQUIRES: default-pie-on-freebsd
+/// Test -DCLANG_DEFAULT_PIE_ON_FREEBSD=on.
+
+// RUN: %clang -### --target=x86_64-unknown-freebsd %s 2>&1 | FileCheck %s 
--check-prefix=PIE2
+
+// PIE2: "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie"
+// PIE2: "-pie"
diff --git a/clang/test/Driver/freebsd-mips-as-pie.c 
b/clang/test/Driver/freebsd-mips-as-pie.c
new file mode 100644
index 0000000000000..86fb0bc6eecd5
--- /dev/null
+++ b/clang/test/Driver/freebsd-mips-as-pie.c
@@ -0,0 +1,94 @@
+// REQUIRES: default-pie-on-freebsd
+
+// Check passing options to the assembler for MIPS targets.
+//
+// RUN: %clang --target=mips-unknown-freebsd -### \
+// RUN:   -no-integrated-as -fno-pic -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EB-AS %s
+// MIPS32-EB-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
+// MIPS32-EB-AS-NOT: "-KPIC"
+//
+// RUN: %clang --target=mips-unknown-freebsd -### \
+// RUN:   -no-integrated-as -fPIC -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIC %s
+// MIPS32-EB-PIC: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
+// MIPS32-EB-PIC: "-KPIC"
+//
+// RUN: %clang --target=mips-unknown-freebsd -### \
+// RUN:   -no-integrated-as -fpic -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIC-SMALL %s
+// MIPS32-EB-PIC-SMALL: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
+// MIPS32-EB-PIC-SMALL: "-KPIC"
+//
+// RUN: %clang --target=mips-unknown-freebsd -### \
+// RUN:   -no-integrated-as -fPIE -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIE %s
+// MIPS32-EB-PIE: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
+// MIPS32-EB-PIE: "-KPIC"
+//
+// RUN: %clang --target=mips-unknown-freebsd -### \
+// RUN:   -no-integrated-as -fpie -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIE-SMALL %s
+// MIPS32-EB-PIE-SMALL: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
+// MIPS32-EB-PIE-SMALL: "-KPIC"
+//
+// RUN: %clang --target=mipsel-unknown-freebsd -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-DEF-EL-AS %s
+// MIPS32-DEF-EL-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EL"
+//
+// RUN: %clang --target=mips64-unknown-freebsd -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS64-EB-AS %s
+// MIPS64-EB-AS: as{{(.exe)?}}" "-march" "mips3" "-mabi" "64" "-EB"
+//
+// RUN: %clang --target=mips64el-unknown-freebsd -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS64-DEF-EL-AS %s
+// MIPS64-DEF-EL-AS: as{{(.exe)?}}" "-march" "mips3" "-mabi" "64" "-EL"
+//
+// RUN: %clang --target=mips64-unknown-freebsd -mabi=n32 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS-N32 %s
+// MIPS-N32: as{{(.exe)?}}" "-march" "mips3" "-mabi" "n32" "-EB"
+//
+// RUN: %clang --target=mipsel-unknown-freebsd -mabi=32 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EL-AS %s
+// MIPS32-EL-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EL"
+//
+// RUN: %clang --target=mips64el-unknown-freebsd -mabi=64 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS64-EL-AS %s
+// MIPS64-EL-AS: as{{(.exe)?}}" "-march" "mips3" "-mabi" "64" "-EL"
+//
+// RUN: %clang --target=mips-linux-freebsd -march=mips32r2 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS-32R2 %s
+// MIPS-32R2: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-EB"
+//
+// RUN: %clang --target=mips-unknown-freebsd -mips32 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-32 %s
+// MIPS-ALIAS-32: as{{(.exe)?}}" "-march" "mips32" "-mabi" "32" "-EB"
+//
+// RUN: %clang --target=mips-unknown-freebsd -mips32r2 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-32R2 %s
+// MIPS-ALIAS-32R2: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-EB"
+//
+// RUN: %clang --target=mips64-unknown-freebsd -mips64 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-64 %s
+// MIPS-ALIAS-64: as{{(.exe)?}}" "-march" "mips64" "-mabi" "64" "-EB"
+//
+// RUN: %clang --target=mips64-unknown-freebsd -mips64r2 -### \
+// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-64R2 %s
+// MIPS-ALIAS-64R2: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-EB"
+//
+// RUN: %clang --target=mips-unknown-freebsd -### \
+// RUN:   -no-integrated-as -fno-pic -G0 -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=MIPS32-EB-AS-G0 %s
+// MIPS32-EB-AS-G0: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB" "-G0"
+// MIPS32-EB-AS-G0-NOT: "-KPIC"
diff --git a/clang/test/Driver/freebsd-mips-as.c 
b/clang/test/Driver/freebsd-mips-as.c
index 428644ab78a9f..2bc5fc72428b9 100644
--- a/clang/test/Driver/freebsd-mips-as.c
+++ b/clang/test/Driver/freebsd-mips-as.c
@@ -1,3 +1,5 @@
+// REQUIRES: !default-pie-on-freebsd
+
 // Check passing options to the assembler for MIPS targets.
 //
 // RUN: %clang --target=mips-unknown-freebsd -### \
diff --git a/clang/test/Driver/freebsd-pie.c b/clang/test/Driver/freebsd-pie.c
new file mode 100644
index 0000000000000..d513617a08796
--- /dev/null
+++ b/clang/test/Driver/freebsd-pie.c
@@ -0,0 +1,275 @@
+// REQUIRES: default-pie-on-freebsd
+
+// RUN: %clang \
+// RUN:   --target=aarch64-pc-freebsd11 %s                              \
+// RUN:   --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:[^"]+]]" "-pie"
+// CHECK-ARM64: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}"  
"--enable-new-dtags" "-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 -no-pie \
+// RUN:   --target=aarch64-pc-freebsd11 %s                              \
+// RUN:   --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 \
+// RUN:   --target=powerpc-pc-freebsd %s    \
+// RUN:   --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" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-m" "elf32ppc_fbsd" "-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 -no-pie \
+// RUN:   --target=powerpc-pc-freebsd %s    \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC-NOPIE %s
+// CHECK-PPC-NOPIE: "-cc1" "-triple" "powerpc-pc-freebsd"
+// CHECK-PPC-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC-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 \
+// RUN:   --target=powerpc64-pc-freebsd %s                              \
+// RUN:   --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{{.*}}" 
"--enable-new-dtags" "-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 -no-pie \
+// RUN:   --target=powerpc64-pc-freebsd %s                              \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64-NOPIE %s
+// CHECK-PPC64-NOPIE: "-cc1" "-triple" "powerpc64-pc-freebsd"
+// CHECK-PPC64-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64-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 \
+// RUN:   --target=powerpc64le-unknown-freebsd13 %s \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE %s
+// CHECK-PPC64LE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
+// CHECK-PPC64LE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64LE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-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 -no-pie \
+// RUN:   --target=powerpc64le-unknown-freebsd13 %s \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE-NOPIE %s
+// CHECK-PPC64LE-NOPIE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
+// CHECK-PPC64LE-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64LE-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"
+
+
+//
+// Check that -m32 properly adjusts the toolchain flags.
+//
+// RUN: %clang --target=x86_64-pc-freebsd -m32 %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LIB32 %s
+// CHECK-LIB32: "-cc1" "-triple" "i386-pc-freebsd"
+// CHECK-LIB32: ld{{.*}}" {{.*}} "-m" "elf_i386_fbsd"
+//
+// RUN: %clang --target=x86_64-pc-freebsd -m32 %s 2>&1 \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -print-search-dirs 2>&1 
\
+// RUN:   | FileCheck --check-prefix=CHECK-LIB32PATHS %s
+// CHECK-LIB32PATHS: libraries: ={{.*:?}}/usr/lib32
+//
+// Check that O32 MIPS uses /usr/lib32 on a 64-bit tree.
+//
+// RUN: %clang --target=mips-freebsd12 %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -print-search-dirs 2>&1 
\
+// RUN:   | FileCheck --check-prefix=CHECK-LIB32PATHS %s
+//
+// Check that MIPS passes the correct linker emulation.
+//
+// RUN: %clang --target=mips-freebsd -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS-LD %s
+// CHECK-MIPS-LD: ld{{.*}}" {{.*}} "-m" "elf32btsmip_fbsd"
+// RUN: %clang --target=mipsel-freebsd -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPSEL-LD %s
+// CHECK-MIPSEL-LD: ld{{.*}}" {{.*}} "-m" "elf32ltsmip_fbsd"
+// RUN: %clang --target=mips64-freebsd -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS64-LD %s
+// CHECK-MIPS64-LD: ld{{.*}}" {{.*}} "-m" "elf64btsmip_fbsd"
+// RUN: %clang --target=mips64el-freebsd -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS64EL-LD %s
+// CHECK-MIPS64EL-LD: ld{{.*}}" {{.*}} "-m" "elf64ltsmip_fbsd"
+// RUN: %clang --target=mips64-freebsd -mabi=n32 -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPSN32-LD %s
+// CHECK-MIPSN32-LD: ld{{.*}}" {{.*}} "-m" "elf32btsmipn32_fbsd"
+// RUN: %clang --target=mips64el-freebsd -mabi=n32 -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPSN32EL-LD %s
+// CHECK-MIPSN32EL-LD: ld{{.*}}" {{.*}} "-m" "elf32ltsmipn32_fbsd"
+//
+// Check that RISC-V passes the correct linker emulation.
+//
+// RUN: %clang --target=riscv64-freebsd -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64I-LD %s
+// CHECK-RV64I-LD: ld{{.*}}" {{.*}} "-m" "elf64lriscv"
+//
+// Check that LoongArch passes the correct linker emulation.
+//
+// RUN: %clang --target=loongarch64-freebsd -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-LD %s
+// CHECK-LA64-LD: ld{{.*}}" {{.*}} "-m" "elf64loongarch"
+//
+// Check options passed to the linker on LoongArch
+//
+// RUN: %clang --target=loongarch64-freebsd -mno-relax -### %s %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-LD-OPTS %s
+// CHECK-LA64-LD-OPTS: ld{{.*}}" {{.*}} "-X" "--no-relax"
+//
+// Check that the new linker flags are passed to FreeBSD
+// RUN: %clang --target=x86_64-pc-freebsd10.0 -m32 %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LDFLAGS_HASH %s
+// RUN: %clang --target=x86_64-pc-freebsd -m32 %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LDFLAGS_HASH %s
+// CHECK-LDFLAGS_HASH: --hash-style=both
+// CHECK-LDFLAGS_HASH: --enable-new-dtags
+//
+// Check that we do not pass --hash-style=gnu and --hash-style=both to linker
+// and provide correct path to the dynamic linker for MIPS platforms.
+// Also verify that we tell the assembler to target the right ISA and ABI.
+// RUN: %clang -### %s 2>&1 \
+// RUN:     --target=mips-unknown-freebsd10.0 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS %s
+// CHECK-MIPS: {{[/\\"]}}ld{{[^" ]*}}"
+// CHECK-MIPS: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
+// CHECK-MIPS-NOT: "--hash-style={{gnu|both}}"
+// RUN: %clang -### %s 2>&1 \
+// RUN:     --target=mipsel-unknown-freebsd10.0 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPSEL %s
+// CHECK-MIPSEL: {{[/\\"]}}ld{{[^" ]*}}"
+// CHECK-MIPSEL: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
+// CHECK-MIPSEL-NOT: "--hash-style={{gnu|both}}"
+// RUN: %clang -### %s 2>&1 \
+// RUN:     --target=mips64-unknown-freebsd10.0 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS64 %s
+// CHECK-MIPS64: {{[/\\"]}}ld{{[^" ]*}}"
+// CHECK-MIPS64: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
+// CHECK-MIPS64-NOT: "--hash-style={{gnu|both}}"
+// RUN: %clang -### %s 2>&1 \
+// RUN:     --target=mips64el-unknown-freebsd10.0 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS64EL %s
+// CHECK-MIPS64EL: {{[/\\"]}}ld{{[^" ]*}}"
+// CHECK-MIPS64EL: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
+// CHECK-MIPS64EL-NOT: "--hash-style={{gnu|both}}"
+
+// RUN: %clang --target=x86_64-pc-freebsd -static %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-STATIC %s
+// CHECK-STATIC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
+// CHECK-STATIC: crt1.o
+// CHECK-STATIC: crtbeginT.o
+
+// RUN: %clang --target=x86_64-pc-freebsd -shared %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-SHARED %s
+// CHECK-SHARED: ld{{.*}}" "--eh-frame-hdr" "-shared"
+// CHECK-SHARED: crti.o
+// CHECK-SHARED: crtbeginS.o
+
+// RUN: %clang --target=x86_64-pc-freebsd -pie %s \
+// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PIE %s
+// CHECK-PIE: pie
+// 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 %s
+// CHECK-NORMAL: Scrt1.o
+// CHECK-NORMAL: 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
+
+// RUN: %clang -### %s --target=arm-unknown-freebsd10.0 -no-integrated-as 2>&1 
\
+// RUN:   | FileCheck --check-prefix=CHECK-ARM %s
+// CHECK-ARM-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"
+// CHECK-ARM: as{{.*}}" "-mfpu=softvfp"{{.*}}"-meabi=5"
+// CHECK-ARM-NOT: as{{.*}}" "-mfpu=vfp"
+// CHECK-ARM-NOT: as{{.*}}" "-matpcs"
+
+// RUN: %clang -### %s --target=arm-gnueabi-freebsd10.0 -no-integrated-as 2>&1 
\
+// RUN:   | FileCheck --check-prefix=CHECK-ARM-EABI %s
+// CHECK-ARM-EABI-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"
+// CHECK-ARM-EABI: as{{.*}}" "-mfpu=softvfp" "-meabi=5"
+// CHECK-ARM-EABI-NOT: as{{.*}}" "-mfpu=vfp"
+// CHECK-ARM-EABI-NOT: as{{.*}}" "-matpcs"
+
+// RUN: %clang -### %s --target=arm-gnueabihf-freebsd10.0 -no-integrated-as 
2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-ARM-EABIHF %s
+// CHECK-ARM-EABIHF-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"
+// CHECK-ARM-EABIHF: as{{.*}}" "-mfpu=vfp" "-meabi=5"
+// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-mfpu=softvfp"
+// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-matpcs"
+
+// RUN: %clang --target=sparc64-unknown-freebsd -### %s -fpic 
-no-integrated-as 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-SPARC-PIC %s
+// CHECK-SPARC-PIC: as{{.*}}" "-KPIC
+
+// RUN: %clang -mcpu=ultrasparc --target=sparc64-unknown-freebsd -### %s 
-no-integrated-as 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-SPARC-CPU %s
+// CHECK-SPARC-CPU: cc1{{.*}}" "-target-cpu" "ultrasparc"
+// CHECK-SPARC-CPU: as{{.*}}" "-Av9a
+
+// Check that -G flags are passed to the linker for mips
+// RUN: %clang --target=mips-unknown-freebsd -### %s -G0 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-MIPS-G %s
+// CHECK-MIPS-G: ld{{.*}}" "-G0"
+
+// Check CPU type for MIPS
+// RUN: %clang --target=mips-unknown-freebsd -### -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-MIPS-CPU %s
+// RUN: %clang --target=mipsel-unknown-freebsd -### -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-MIPS-CPU %s
+// CHECK-MIPS-CPU: "-target-cpu" "mips2"
+
+// Check CPU type for MIPS64
+// RUN: %clang --target=mips64-unknown-freebsd -### -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-MIPS64-CPU %s
+// RUN: %clang --target=mips64el-unknown-freebsd -### -c %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-MIPS64-CPU %s
+// CHECK-MIPS64-CPU: "-target-cpu" "mips3"
+
+// RUN: %clang --target=ppc64-unknown-freebsd13.0 -### -S %s 2>&1 | \
+// RUN: FileCheck -check-prefix=PPC64-MUNWIND %s
+// PPC64-MUNWIND: "-funwind-tables=2"
+
+/// -r suppresses -dynamic-linker, default -l and crt*.o like -nostdlib.
+// RUN: %clang -### %s --target=aarch64-pc-freebsd11 -r \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | FileCheck %s 
--check-prefix=RELOCATABLE
+// RELOCATABLE:     "-r"
+// RELOCATABLE-NOT: "-dynamic-linker"
+// RELOCATABLE-NOT: "-l
+// RELOCATABLE-NOT: crt{{[^./\\]+}}.o
+
+// Check that the -X and --no-relax flags are passed to the linker on riscv64
+// RUN: %clang --target=riscv64-unknown-freebsd -mno-relax -### %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=RISCV64-FLAGS %s
+// RISCV64-FLAGS: "-X" "--no-relax"
+
+/// -rdynamic becomes -export-dynamic; -s, -t, and -T are forwarded.
+// RUN: %clang --target=x86_64-unknown-freebsd -rdynamic -s -t -T a.lds -### 
%s \
+// RUN:   2>&1 | FileCheck --check-prefix=PASS %s
+// PASS:      "--eh-frame-hdr"
+// PASS-SAME: "-export-dynamic"
+// PASS-SAME: "-s" "-t" "-T" "a.lds"
+
+// RUN: %clang -target riscv32be-unknown-freebsd -### -c %s 2>&1 | FileCheck 
%s --check-prefix=RV32BE
+// RV32BE-NOT: elf32briscv
diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c
index bb0558b9ceb3e..2c56e08382b6b 100644
--- a/clang/test/Driver/freebsd.c
+++ b/clang/test/Driver/freebsd.c
@@ -1,3 +1,5 @@
+// REQUIRES:  !default-pie-on-freebsd
+
 // RUN: %clang \
 // RUN:   --target=aarch64-pc-freebsd11 %s                              \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
diff --git a/clang/test/Driver/hie-fpie-option-freebsd.hip 
b/clang/test/Driver/hie-fpie-option-freebsd.hip
new file mode 100644
index 0000000000000..24dd3c4440062
--- /dev/null
+++ b/clang/test/Driver/hie-fpie-option-freebsd.hip
@@ -0,0 +1,38 @@
+// REQUIRES: default-pie-on-freebsd
+
+// -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
+
+// RUN: %clang -### --target=x86_64-unknown-freebsd \
+// RUN:   --offload-arch=gfx906 %s -nogpulib -nogpuinc \
+// RUN:   -fPIE \
+// 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:   -fPIE \
+// RUN:   2>&1 | FileCheck -check-prefixes=DEV,HOST-PIE %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/clang/test/lit.cfg.py b/clang/test/lit.cfg.py
index 5a5e819c9b5a1..6013dfb6ad765 100644
--- a/clang/test/lit.cfg.py
+++ b/clang/test/lit.cfg.py
@@ -337,6 +337,9 @@ def have_host_clang_repl_cuda():
 if config.has_plugins and config.llvm_plugin_ext:
     config.available_features.add("plugins")
 
+if config.clang_default_pie_on_freebsd:
+    config.available_features.add("default-pie-on-freebsd")
+
 if config.clang_default_pie_on_linux:
     config.available_features.add("default-pie-on-linux")
 
diff --git a/clang/test/lit.site.cfg.py.in b/clang/test/lit.site.cfg.py.in
index cb35118167d99..0ddca8452da23 100644
--- a/clang/test/lit.site.cfg.py.in
+++ b/clang/test/lit.site.cfg.py.in
@@ -21,6 +21,7 @@ config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
 config.have_zlib = @LLVM_ENABLE_ZLIB@
 config.have_zstd = @LLVM_ENABLE_ZSTD@
 config.clang_objc_rewriter = @CLANG_ENABLE_OBJC_REWRITER@
+config.clang_default_pie_on_freebsd = @CLANG_DEFAULT_PIE_ON_FREEBSD@
 config.clang_default_pie_on_linux = @CLANG_DEFAULT_PIE_ON_LINUX@
 config.clang_default_cxx_stdlib = "@CLANG_DEFAULT_CXX_STDLIB@"
 config.clang_staticanalyzer = @CLANG_ENABLE_STATIC_ANALYZER@
diff --git a/flang/test/Driver/linker-options.f90 
b/flang/test/Driver/linker-options.f90
index 07f967b4bac5d..55909fe034394 100644
--- a/flang/test/Driver/linker-options.f90
+++ b/flang/test/Driver/linker-options.f90
@@ -25,10 +25,10 @@
 ! 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
+! 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 \
@@ -60,19 +60,19 @@
 !
 ! On FreeBSD, -pie is not passed to the linker, but can be forced.
 ! RUN: %flang -target amd64-pc-freebsd -### %s 2>&1 \
-! RUN:   | FileCheck %s --check-prefix=NO-PIE
+! RUN:   | FileCheck %s --check-prefix=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:   | FileCheck %s --check-prefix=PIE
 ! RUN: %flang -target arm-unknown-freebsd -### %s 2>&1 \
-! RUN:   | FileCheck %s --check-prefix=NO-PIE
+! RUN:   | FileCheck %s --check-prefix=PIE
 ! RUN: %flang -target powerpc-unknown-freebsd -### %s 2>&1 \
-! RUN:   | FileCheck %s --check-prefix=NO-PIE
+! RUN:   | FileCheck %s --check-prefix=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 i386-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 \
diff --git a/flang/test/Driver/pic-flags.f90 b/flang/test/Driver/pic-flags.f90
index 5a06163c485cd..34a13ed228101 100644
--- a/flang/test/Driver/pic-flags.f90
+++ b/flang/test/Driver/pic-flags.f90
@@ -1,5 +1,6 @@
 ! RUN: %if aarch64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=aarch64-linux-gnu -fno-pie 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-STATIC,CHECK-STATIC-IR %}
 
+! RUN: %if x86_64-registered-target && clang_default_pie_on_freebsd %{ %flang 
-v -S -emit-llvm -o - %s --target=x86_64-unknown-freebsd 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
 ! RUN: %if aarch64-registered-target && clang_default_pie_on_linux %{ %flang 
-v -S -emit-llvm -o - %s --target=aarch64-linux-gnu 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
 ! RUN: %if aarch64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=aarch64-linux-gnu -fpie 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL1,CHECK-PIE-LEVEL1-IR %}
 ! RUN: %if aarch64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=aarch64-linux-gnu -fPIE 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
diff --git a/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn 
b/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn
index f8196d1b248e5..c5b30e30fe76d 100644
--- a/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn
@@ -8,6 +8,7 @@ write_cmake_config("Config") {
   output = "$target_gen_dir/config.h"
   values = [
     "BUG_REPORT_URL=https://github.com/llvm/llvm-project/issues/";,
+    "CLANG_DEFAULT_PIE_ON_FREEBSD=1",
     "CLANG_DEFAULT_PIE_ON_LINUX=1",
     "CLANG_DEFAULT_LINKER=",
     "CLANG_DEFAULT_CXX_STDLIB=",
diff --git a/llvm/utils/gn/secondary/clang/test/BUILD.gn 
b/llvm/utils/gn/secondary/clang/test/BUILD.gn
index 73f3bd020a1e0..1da3a1a3062b2 100644
--- a/llvm/utils/gn/secondary/clang/test/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang/test/BUILD.gn
@@ -52,6 +52,7 @@ write_lit_config("lit_site_cfg") {
     "CLANG_BUILD_EXAMPLES=0",
     "CLANG_BUILT_STANDALONE=0",
     "CLANG_DEFAULT_CXX_STDLIB=",  # Empty string means "default value" here.
+    "CLANG_DEFAULT_PIE_ON_FREEBSD=0",
     "CLANG_DEFAULT_PIE_ON_LINUX=0",
     "CLANG_ENABLE_CIR=0",
     "CLANG_ENABLE_OBJC_REWRITER=0",
diff --git 
a/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h 
b/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h
index 7f7308f338966..0f01ac0e9ecbc 100644
--- a/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h
+++ b/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h
@@ -22,6 +22,9 @@
 /* Bug report URL. */
 #define BUG_REPORT_URL "https://github.com/llvm/llvm-project/issues/";
 
+/* Default to -fPIE and -pie on FreeBSD. */
+#define CLANG_DEFAULT_PIE_ON_FREEBSD 1
+
 /* Default to -fPIE and -pie on Linux. */
 #define CLANG_DEFAULT_PIE_ON_LINUX 1
 

>From ca4b04d4179b7f9e2517e2cd4e87571d164cc100 Mon Sep 17 00:00:00 2001
From: ShengYi Hung <[email protected]>
Date: Wed, 15 Jul 2026 18:03:55 +0800
Subject: [PATCH 2/4] fixup! [Clang] Switch to Default PIE on FreeBSD

---
 clang/test/Driver/freebsd-default-pie.c |   7 -
 clang/test/Driver/freebsd-mips-as-pie.c |  94 --------
 clang/test/Driver/freebsd-mips-as.c     |   6 +-
 clang/test/Driver/freebsd-pie.c         | 275 ------------------------
 clang/test/Driver/freebsd.c             | 108 +++++++++-
 5 files changed, 103 insertions(+), 387 deletions(-)
 delete mode 100644 clang/test/Driver/freebsd-default-pie.c
 delete mode 100644 clang/test/Driver/freebsd-mips-as-pie.c
 delete mode 100644 clang/test/Driver/freebsd-pie.c

diff --git a/clang/test/Driver/freebsd-default-pie.c 
b/clang/test/Driver/freebsd-default-pie.c
deleted file mode 100644
index 58e7b3a0b0efe..0000000000000
--- a/clang/test/Driver/freebsd-default-pie.c
+++ /dev/null
@@ -1,7 +0,0 @@
-// REQUIRES: default-pie-on-freebsd
-/// Test -DCLANG_DEFAULT_PIE_ON_FREEBSD=on.
-
-// RUN: %clang -### --target=x86_64-unknown-freebsd %s 2>&1 | FileCheck %s 
--check-prefix=PIE2
-
-// PIE2: "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie"
-// PIE2: "-pie"
diff --git a/clang/test/Driver/freebsd-mips-as-pie.c 
b/clang/test/Driver/freebsd-mips-as-pie.c
deleted file mode 100644
index 86fb0bc6eecd5..0000000000000
--- a/clang/test/Driver/freebsd-mips-as-pie.c
+++ /dev/null
@@ -1,94 +0,0 @@
-// REQUIRES: default-pie-on-freebsd
-
-// Check passing options to the assembler for MIPS targets.
-//
-// RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -fno-pic -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EB-AS %s
-// MIPS32-EB-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
-// MIPS32-EB-AS-NOT: "-KPIC"
-//
-// RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -fPIC -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIC %s
-// MIPS32-EB-PIC: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
-// MIPS32-EB-PIC: "-KPIC"
-//
-// RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -fpic -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIC-SMALL %s
-// MIPS32-EB-PIC-SMALL: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
-// MIPS32-EB-PIC-SMALL: "-KPIC"
-//
-// RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -fPIE -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIE %s
-// MIPS32-EB-PIE: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
-// MIPS32-EB-PIE: "-KPIC"
-//
-// RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -fpie -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EB-PIE-SMALL %s
-// MIPS32-EB-PIE-SMALL: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
-// MIPS32-EB-PIE-SMALL: "-KPIC"
-//
-// RUN: %clang --target=mipsel-unknown-freebsd -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-DEF-EL-AS %s
-// MIPS32-DEF-EL-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EL"
-//
-// RUN: %clang --target=mips64-unknown-freebsd -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS64-EB-AS %s
-// MIPS64-EB-AS: as{{(.exe)?}}" "-march" "mips3" "-mabi" "64" "-EB"
-//
-// RUN: %clang --target=mips64el-unknown-freebsd -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS64-DEF-EL-AS %s
-// MIPS64-DEF-EL-AS: as{{(.exe)?}}" "-march" "mips3" "-mabi" "64" "-EL"
-//
-// RUN: %clang --target=mips64-unknown-freebsd -mabi=n32 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS-N32 %s
-// MIPS-N32: as{{(.exe)?}}" "-march" "mips3" "-mabi" "n32" "-EB"
-//
-// RUN: %clang --target=mipsel-unknown-freebsd -mabi=32 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EL-AS %s
-// MIPS32-EL-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EL"
-//
-// RUN: %clang --target=mips64el-unknown-freebsd -mabi=64 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS64-EL-AS %s
-// MIPS64-EL-AS: as{{(.exe)?}}" "-march" "mips3" "-mabi" "64" "-EL"
-//
-// RUN: %clang --target=mips-linux-freebsd -march=mips32r2 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS-32R2 %s
-// MIPS-32R2: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-EB"
-//
-// RUN: %clang --target=mips-unknown-freebsd -mips32 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-32 %s
-// MIPS-ALIAS-32: as{{(.exe)?}}" "-march" "mips32" "-mabi" "32" "-EB"
-//
-// RUN: %clang --target=mips-unknown-freebsd -mips32r2 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-32R2 %s
-// MIPS-ALIAS-32R2: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-EB"
-//
-// RUN: %clang --target=mips64-unknown-freebsd -mips64 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-64 %s
-// MIPS-ALIAS-64: as{{(.exe)?}}" "-march" "mips64" "-mabi" "64" "-EB"
-//
-// RUN: %clang --target=mips64-unknown-freebsd -mips64r2 -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS-ALIAS-64R2 %s
-// MIPS-ALIAS-64R2: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-EB"
-//
-// RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -fno-pic -G0 -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=MIPS32-EB-AS-G0 %s
-// MIPS32-EB-AS-G0: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB" "-G0"
-// MIPS32-EB-AS-G0-NOT: "-KPIC"
diff --git a/clang/test/Driver/freebsd-mips-as.c 
b/clang/test/Driver/freebsd-mips-as.c
index 2bc5fc72428b9..a0872e49cb99d 100644
--- a/clang/test/Driver/freebsd-mips-as.c
+++ b/clang/test/Driver/freebsd-mips-as.c
@@ -1,9 +1,7 @@
-// REQUIRES: !default-pie-on-freebsd
-
 // Check passing options to the assembler for MIPS targets.
 //
 // RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -c %s 2>&1 \
+// RUN:   -no-integrated-as %if default-pie-on-freebsd %{ -fno-pic %} -c %s 
2>&1 \
 // RUN:   | FileCheck -check-prefix=MIPS32-EB-AS %s
 // MIPS32-EB-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
 // MIPS32-EB-AS-NOT: "-KPIC"
@@ -88,7 +86,7 @@
 // MIPS-ALIAS-64R2: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-EB"
 //
 // RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as -G0 -c %s 2>&1 \
+// RUN:   -no-integrated-as %if default-pie-on-freebsd %{ -fno-pic %} -G0 -c 
%s 2>&1 \
 // RUN:   | FileCheck -check-prefix=MIPS32-EB-AS-G0 %s
 // MIPS32-EB-AS-G0: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB" "-G0"
 // MIPS32-EB-AS-G0-NOT: "-KPIC"
diff --git a/clang/test/Driver/freebsd-pie.c b/clang/test/Driver/freebsd-pie.c
deleted file mode 100644
index d513617a08796..0000000000000
--- a/clang/test/Driver/freebsd-pie.c
+++ /dev/null
@@ -1,275 +0,0 @@
-// REQUIRES: default-pie-on-freebsd
-
-// RUN: %clang \
-// RUN:   --target=aarch64-pc-freebsd11 %s                              \
-// RUN:   --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:[^"]+]]" "-pie"
-// CHECK-ARM64: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}"  
"--enable-new-dtags" "-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 -no-pie \
-// RUN:   --target=aarch64-pc-freebsd11 %s                              \
-// RUN:   --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 \
-// RUN:   --target=powerpc-pc-freebsd %s    \
-// RUN:   --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" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-m" "elf32ppc_fbsd" "-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 -no-pie \
-// RUN:   --target=powerpc-pc-freebsd %s    \
-// RUN:   --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC-NOPIE %s
-// CHECK-PPC-NOPIE: "-cc1" "-triple" "powerpc-pc-freebsd"
-// CHECK-PPC-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-PPC-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 \
-// RUN:   --target=powerpc64-pc-freebsd %s                              \
-// RUN:   --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{{.*}}" 
"--enable-new-dtags" "-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 -no-pie \
-// RUN:   --target=powerpc64-pc-freebsd %s                              \
-// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC64-NOPIE %s
-// CHECK-PPC64-NOPIE: "-cc1" "-triple" "powerpc64-pc-freebsd"
-// CHECK-PPC64-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-PPC64-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 \
-// RUN:   --target=powerpc64le-unknown-freebsd13 %s \
-// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE %s
-// CHECK-PPC64LE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
-// CHECK-PPC64LE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-PPC64LE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-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 -no-pie \
-// RUN:   --target=powerpc64le-unknown-freebsd13 %s \
-// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE-NOPIE %s
-// CHECK-PPC64LE-NOPIE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
-// CHECK-PPC64LE-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-PPC64LE-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"
-
-
-//
-// Check that -m32 properly adjusts the toolchain flags.
-//
-// RUN: %clang --target=x86_64-pc-freebsd -m32 %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-LIB32 %s
-// CHECK-LIB32: "-cc1" "-triple" "i386-pc-freebsd"
-// CHECK-LIB32: ld{{.*}}" {{.*}} "-m" "elf_i386_fbsd"
-//
-// RUN: %clang --target=x86_64-pc-freebsd -m32 %s 2>&1 \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -print-search-dirs 2>&1 
\
-// RUN:   | FileCheck --check-prefix=CHECK-LIB32PATHS %s
-// CHECK-LIB32PATHS: libraries: ={{.*:?}}/usr/lib32
-//
-// Check that O32 MIPS uses /usr/lib32 on a 64-bit tree.
-//
-// RUN: %clang --target=mips-freebsd12 %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -print-search-dirs 2>&1 
\
-// RUN:   | FileCheck --check-prefix=CHECK-LIB32PATHS %s
-//
-// Check that MIPS passes the correct linker emulation.
-//
-// RUN: %clang --target=mips-freebsd -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS-LD %s
-// CHECK-MIPS-LD: ld{{.*}}" {{.*}} "-m" "elf32btsmip_fbsd"
-// RUN: %clang --target=mipsel-freebsd -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPSEL-LD %s
-// CHECK-MIPSEL-LD: ld{{.*}}" {{.*}} "-m" "elf32ltsmip_fbsd"
-// RUN: %clang --target=mips64-freebsd -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS64-LD %s
-// CHECK-MIPS64-LD: ld{{.*}}" {{.*}} "-m" "elf64btsmip_fbsd"
-// RUN: %clang --target=mips64el-freebsd -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS64EL-LD %s
-// CHECK-MIPS64EL-LD: ld{{.*}}" {{.*}} "-m" "elf64ltsmip_fbsd"
-// RUN: %clang --target=mips64-freebsd -mabi=n32 -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPSN32-LD %s
-// CHECK-MIPSN32-LD: ld{{.*}}" {{.*}} "-m" "elf32btsmipn32_fbsd"
-// RUN: %clang --target=mips64el-freebsd -mabi=n32 -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPSN32EL-LD %s
-// CHECK-MIPSN32EL-LD: ld{{.*}}" {{.*}} "-m" "elf32ltsmipn32_fbsd"
-//
-// Check that RISC-V passes the correct linker emulation.
-//
-// RUN: %clang --target=riscv64-freebsd -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-RV64I-LD %s
-// CHECK-RV64I-LD: ld{{.*}}" {{.*}} "-m" "elf64lriscv"
-//
-// Check that LoongArch passes the correct linker emulation.
-//
-// RUN: %clang --target=loongarch64-freebsd -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-LA64-LD %s
-// CHECK-LA64-LD: ld{{.*}}" {{.*}} "-m" "elf64loongarch"
-//
-// Check options passed to the linker on LoongArch
-//
-// RUN: %clang --target=loongarch64-freebsd -mno-relax -### %s %s 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-LA64-LD-OPTS %s
-// CHECK-LA64-LD-OPTS: ld{{.*}}" {{.*}} "-X" "--no-relax"
-//
-// Check that the new linker flags are passed to FreeBSD
-// RUN: %clang --target=x86_64-pc-freebsd10.0 -m32 %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-LDFLAGS_HASH %s
-// RUN: %clang --target=x86_64-pc-freebsd -m32 %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-LDFLAGS_HASH %s
-// CHECK-LDFLAGS_HASH: --hash-style=both
-// CHECK-LDFLAGS_HASH: --enable-new-dtags
-//
-// Check that we do not pass --hash-style=gnu and --hash-style=both to linker
-// and provide correct path to the dynamic linker for MIPS platforms.
-// Also verify that we tell the assembler to target the right ISA and ABI.
-// RUN: %clang -### %s 2>&1 \
-// RUN:     --target=mips-unknown-freebsd10.0 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS %s
-// CHECK-MIPS: {{[/\\"]}}ld{{[^" ]*}}"
-// CHECK-MIPS: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
-// CHECK-MIPS-NOT: "--hash-style={{gnu|both}}"
-// RUN: %clang -### %s 2>&1 \
-// RUN:     --target=mipsel-unknown-freebsd10.0 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPSEL %s
-// CHECK-MIPSEL: {{[/\\"]}}ld{{[^" ]*}}"
-// CHECK-MIPSEL: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
-// CHECK-MIPSEL-NOT: "--hash-style={{gnu|both}}"
-// RUN: %clang -### %s 2>&1 \
-// RUN:     --target=mips64-unknown-freebsd10.0 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS64 %s
-// CHECK-MIPS64: {{[/\\"]}}ld{{[^" ]*}}"
-// CHECK-MIPS64: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
-// CHECK-MIPS64-NOT: "--hash-style={{gnu|both}}"
-// RUN: %clang -### %s 2>&1 \
-// RUN:     --target=mips64el-unknown-freebsd10.0 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS64EL %s
-// CHECK-MIPS64EL: {{[/\\"]}}ld{{[^" ]*}}"
-// CHECK-MIPS64EL: "-dynamic-linker" "{{.*}}/libexec/ld-elf.so.1"
-// CHECK-MIPS64EL-NOT: "--hash-style={{gnu|both}}"
-
-// RUN: %clang --target=x86_64-pc-freebsd -static %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-STATIC %s
-// CHECK-STATIC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
-// CHECK-STATIC: crt1.o
-// CHECK-STATIC: crtbeginT.o
-
-// RUN: %clang --target=x86_64-pc-freebsd -shared %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-SHARED %s
-// CHECK-SHARED: ld{{.*}}" "--eh-frame-hdr" "-shared"
-// CHECK-SHARED: crti.o
-// CHECK-SHARED: crtbeginS.o
-
-// RUN: %clang --target=x86_64-pc-freebsd -pie %s \
-// RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PIE %s
-// CHECK-PIE: pie
-// 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 %s
-// CHECK-NORMAL: Scrt1.o
-// CHECK-NORMAL: 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
-
-// RUN: %clang -### %s --target=arm-unknown-freebsd10.0 -no-integrated-as 2>&1 
\
-// RUN:   | FileCheck --check-prefix=CHECK-ARM %s
-// CHECK-ARM-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"
-// CHECK-ARM: as{{.*}}" "-mfpu=softvfp"{{.*}}"-meabi=5"
-// CHECK-ARM-NOT: as{{.*}}" "-mfpu=vfp"
-// CHECK-ARM-NOT: as{{.*}}" "-matpcs"
-
-// RUN: %clang -### %s --target=arm-gnueabi-freebsd10.0 -no-integrated-as 2>&1 
\
-// RUN:   | FileCheck --check-prefix=CHECK-ARM-EABI %s
-// CHECK-ARM-EABI-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"
-// CHECK-ARM-EABI: as{{.*}}" "-mfpu=softvfp" "-meabi=5"
-// CHECK-ARM-EABI-NOT: as{{.*}}" "-mfpu=vfp"
-// CHECK-ARM-EABI-NOT: as{{.*}}" "-matpcs"
-
-// RUN: %clang -### %s --target=arm-gnueabihf-freebsd10.0 -no-integrated-as 
2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-ARM-EABIHF %s
-// CHECK-ARM-EABIHF-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"
-// CHECK-ARM-EABIHF: as{{.*}}" "-mfpu=vfp" "-meabi=5"
-// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-mfpu=softvfp"
-// CHECK-ARM-EABIHF-NOT: as{{.*}}" "-matpcs"
-
-// RUN: %clang --target=sparc64-unknown-freebsd -### %s -fpic 
-no-integrated-as 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-SPARC-PIC %s
-// CHECK-SPARC-PIC: as{{.*}}" "-KPIC
-
-// RUN: %clang -mcpu=ultrasparc --target=sparc64-unknown-freebsd -### %s 
-no-integrated-as 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-SPARC-CPU %s
-// CHECK-SPARC-CPU: cc1{{.*}}" "-target-cpu" "ultrasparc"
-// CHECK-SPARC-CPU: as{{.*}}" "-Av9a
-
-// Check that -G flags are passed to the linker for mips
-// RUN: %clang --target=mips-unknown-freebsd -### %s -G0 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-MIPS-G %s
-// CHECK-MIPS-G: ld{{.*}}" "-G0"
-
-// Check CPU type for MIPS
-// RUN: %clang --target=mips-unknown-freebsd -### -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHECK-MIPS-CPU %s
-// RUN: %clang --target=mipsel-unknown-freebsd -### -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHECK-MIPS-CPU %s
-// CHECK-MIPS-CPU: "-target-cpu" "mips2"
-
-// Check CPU type for MIPS64
-// RUN: %clang --target=mips64-unknown-freebsd -### -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHECK-MIPS64-CPU %s
-// RUN: %clang --target=mips64el-unknown-freebsd -### -c %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHECK-MIPS64-CPU %s
-// CHECK-MIPS64-CPU: "-target-cpu" "mips3"
-
-// RUN: %clang --target=ppc64-unknown-freebsd13.0 -### -S %s 2>&1 | \
-// RUN: FileCheck -check-prefix=PPC64-MUNWIND %s
-// PPC64-MUNWIND: "-funwind-tables=2"
-
-/// -r suppresses -dynamic-linker, default -l and crt*.o like -nostdlib.
-// RUN: %clang -### %s --target=aarch64-pc-freebsd11 -r \
-// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree 2>&1 | FileCheck %s 
--check-prefix=RELOCATABLE
-// RELOCATABLE:     "-r"
-// RELOCATABLE-NOT: "-dynamic-linker"
-// RELOCATABLE-NOT: "-l
-// RELOCATABLE-NOT: crt{{[^./\\]+}}.o
-
-// Check that the -X and --no-relax flags are passed to the linker on riscv64
-// RUN: %clang --target=riscv64-unknown-freebsd -mno-relax -### %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=RISCV64-FLAGS %s
-// RISCV64-FLAGS: "-X" "--no-relax"
-
-/// -rdynamic becomes -export-dynamic; -s, -t, and -T are forwarded.
-// RUN: %clang --target=x86_64-unknown-freebsd -rdynamic -s -t -T a.lds -### 
%s \
-// RUN:   2>&1 | FileCheck --check-prefix=PASS %s
-// PASS:      "--eh-frame-hdr"
-// PASS-SAME: "-export-dynamic"
-// PASS-SAME: "-s" "-t" "-T" "a.lds"
-
-// RUN: %clang -target riscv32be-unknown-freebsd -### -c %s 2>&1 | FileCheck 
%s --check-prefix=RV32BE
-// RV32BE-NOT: elf32briscv
diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c
index 2c56e08382b6b..0caff10ca5e6c 100644
--- a/clang/test/Driver/freebsd.c
+++ b/clang/test/Driver/freebsd.c
@@ -1,37 +1,109 @@
-// REQUIRES:  !default-pie-on-freebsd
-
 // RUN: %clang \
 // RUN:   --target=aarch64-pc-freebsd11 %s                              \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-ARM64 %s
+// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-ARM64-PIE %s %} \
+// RUN:   %else %{ | 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"
+
+// CHECK-ARM64-PIE: "-cc1" "-triple" "aarch64-pc-freebsd11"
+// CHECK-ARM64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
+// CHECK-ARM64-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}"  
"--enable-new-dtags" "-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 \
+// RUN:   --target=aarch64-pc-freebsd11 %s                              \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-ARM64-PIE %s
+
+// RUN: %clang -no-pie \
+// RUN:   --target=aarch64-pc-freebsd11 %s                              \
+// RUN:   --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 \
 // RUN:   --target=powerpc-pc-freebsd %s    \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC %s
+// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-PPC-PIE %s %} \
+// RUN:   %else %{ | FileCheck --check-prefix=CHECK-PPC %s %}
 // CHECK-PPC: "-cc1" "-triple" "powerpc-pc-freebsd"
 // CHECK-PPC: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-PPC: "--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-PPC-PIE: "-cc1" "-triple" "powerpc-pc-freebsd"
+// CHECK-PPC-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
+// CHECK-PPC-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-m" "elf32ppc_fbsd" "-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 \
+// RUN:   --target=powerpc-pc-freebsd %s    \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC-PIE %s
+
+// RUN: %clang -no-pie \
+// RUN:   --target=powerpc-pc-freebsd %s    \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC-NOPIE %s
+// CHECK-PPC-NOPIE: "-cc1" "-triple" "powerpc-pc-freebsd"
+// CHECK-PPC-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC-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 \
 // RUN:   --target=powerpc64-pc-freebsd %s                              \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC64 %s
+// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-PPC64-PIE %s %} \
+// RUN:   %else %{ | 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-PIE: "-cc1" "-triple" "powerpc64-pc-freebsd"
+// CHECK-PPC64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
+// CHECK-PPC64-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-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 \
+// RUN:   --target=powerpc64-pc-freebsd %s                              \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64-PIE %s
+
+// RUN: %clang -no-pie \
+// RUN:   --target=powerpc64-pc-freebsd %s                              \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64-NOPIE %s
+// CHECK-PPC64-NOPIE: "-cc1" "-triple" "powerpc64-pc-freebsd"
+// CHECK-PPC64-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64-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 \
 // RUN:   --target=powerpc64le-unknown-freebsd13 %s \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE %s
+// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-PPC64LE-PIE %s %} \
+// RUN:   %else %{ | FileCheck --check-prefix=CHECK-PPC64LE %s %}
 // CHECK-PPC64LE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
 // CHECK-PPC64LE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-PPC64LE: "--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-PPC64LE-PIE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
+// CHECK-PPC64LE-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
+// CHECK-PPC64LE-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-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 \
+// RUN:   --target=powerpc64le-unknown-freebsd13 %s \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE-PIE %s
+
+// RUN: %clang -no-pie \
+// RUN:   --target=powerpc64le-unknown-freebsd13 %s \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE-NOPIE %s
+// CHECK-PPC64LE-NOPIE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
+// CHECK-PPC64LE-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64LE-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"
+
 //
 // Check that -m32 properly adjusts the toolchain flags.
 //
@@ -152,10 +224,32 @@
 
 // RUN: %clang --target=x86_64-pc-freebsd %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   | FileCheck --check-prefix=CHECK-NORMAL %s
+// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-NORMAL-PIE %s %} \
+// RUN:   %else %{ | FileCheck --check-prefix=CHECK-NORMAL %s %}
 // CHECK-NORMAL: crt1.o
 // CHECK-NORMAL: crtbegin.o
 
+// 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
+
+/// Test -DCLANG_DEFAULT_PIE_ON_FREEBSD=on.
+// RUN: %clang -### --target=x86_64-unknown-freebsd %s 2>&1 \
+// RUN:   %if default-pie-on-freebsd %{ | FileCheck --check-prefix=PIE2 %s %} \
+// RUN:   %else %{ | FileCheck --check-prefix=PIE2-OFF %s %}
+
+// PIE2: "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie"
+// PIE2: "-pie"
+
+// PIE2-OFF: "-mrelocation-model" "static"
+// PIE2-OFF-NOT: "-pic-is-pie"
+// PIE2-OFF-NOT: "-pie"
+
 // RUN: %clang -### %s --target=arm-unknown-freebsd10.0 -no-integrated-as 2>&1 
\
 // RUN:   | FileCheck --check-prefix=CHECK-ARM %s
 // CHECK-ARM-NOT: "-cc1"{{.*}}" "-exception-model=sjlj"

>From 40be4f9dd9c4dc68553a02929023e60706c28bf5 Mon Sep 17 00:00:00 2001
From: ShengYi Hung <[email protected]>
Date: Thu, 16 Jul 2026 13:47:45 +0800
Subject: [PATCH 3/4] fixup! [Clang] Switch to Default PIE on FreeBSD

---
 clang/CMakeLists.txt                          |  2 -
 clang/include/clang/Config/config.h.cmake     |  3 -
 clang/lib/Driver/ToolChains/FreeBSD.cpp       | 12 +++-
 clang/test/CMakeLists.txt                     |  1 -
 clang/test/Driver/freebsd-mips-as.c           |  4 +-
 clang/test/Driver/freebsd.c                   | 56 +++++++++----------
 ...reebsd.hip => hip-fpie-option-freebsd.hip} |  2 -
 clang/test/lit.cfg.py                         |  3 -
 clang/test/lit.site.cfg.py.in                 |  1 -
 flang/test/Driver/linker-options.f90          |  4 +-
 flang/test/Driver/pic-flags.f90               |  2 +-
 .../clang/include/clang/Config/BUILD.gn       |  1 -
 llvm/utils/gn/secondary/clang/test/BUILD.gn   |  1 -
 .../clang/include/clang/Config/config.h       |  3 -
 14 files changed, 41 insertions(+), 54 deletions(-)
 rename clang/test/Driver/{hie-fpie-option-freebsd.hip => 
hip-fpie-option-freebsd.hip} (97%)

diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt
index 7617e21157903..20276a034d50a 100644
--- a/clang/CMakeLists.txt
+++ b/clang/CMakeLists.txt
@@ -286,8 +286,6 @@ set(PPC_LINUX_DEFAULT_IEEELONGDOUBLE OFF CACHE BOOL
 set(CLANG_SPAWN_CC1 OFF CACHE BOOL
     "Whether clang should use a new process for the CC1 invocation")
 
-option(CLANG_DEFAULT_PIE_ON_FREEBSD "Default to -fPIE and -pie on freebsd" ON)
-
 option(CLANG_DEFAULT_PIE_ON_LINUX "Default to -fPIE and -pie on linux-gnu" ON)
 
 set(CLANG_DEFAULT_LINKER "" CACHE STRING
diff --git a/clang/include/clang/Config/config.h.cmake 
b/clang/include/clang/Config/config.h.cmake
index e92d449170908..11b4096726f67 100644
--- a/clang/include/clang/Config/config.h.cmake
+++ b/clang/include/clang/Config/config.h.cmake
@@ -8,9 +8,6 @@
 /* Bug report URL. */
 #define BUG_REPORT_URL "${BUG_REPORT_URL}"
 
-/* Default to -fPIE and -pie on FreeBSD. */
-#cmakedefine01 CLANG_DEFAULT_PIE_ON_FREEBSD
-
 /* Default to -fPIE and -pie on Linux. */
 #cmakedefine01 CLANG_DEFAULT_PIE_ON_LINUX
 
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp 
b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index 638a28bf4d60e..c728ff4e20a57 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -134,8 +134,10 @@ void freebsd::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   const Driver &D = ToolChain.getDriver();
   const llvm::Triple &Triple = ToolChain.getTriple();
   const llvm::Triple::ArchType Arch = ToolChain.getArch();
-  const bool IsPIE = Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
-                                  ToolChain.isPIEDefault(Args));
+  const bool IsPIE =
+      !Args.hasArg(options::OPT_shared, options::OPT_static, options::OPT_r) &&
+      Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
+                   ToolChain.isPIEDefault(Args));
   ArgStringList CmdArgs;
 
   // Silence warning for "clang -g foo.o -o foo"
@@ -472,7 +474,11 @@ FreeBSD::getDefaultUnwindTableLevel(const ArgList &Args) 
const {
 }
 
 bool FreeBSD::isPIEDefault(const llvm::opt::ArgList &Args) const {
-  return CLANG_DEFAULT_PIE_ON_FREEBSD || 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/CMakeLists.txt b/clang/test/CMakeLists.txt
index d99b9a1e0602f..15170bbc2d1ed 100644
--- a/clang/test/CMakeLists.txt
+++ b/clang/test/CMakeLists.txt
@@ -5,7 +5,6 @@ llvm_canonicalize_cmake_booleans(
   BUILD_SHARED_LIBS
   CLANG_BUILD_EXAMPLES
   CLANG_BUILT_STANDALONE
-  CLANG_DEFAULT_PIE_ON_FREEBSD
   CLANG_DEFAULT_PIE_ON_LINUX
   CLANG_ENABLE_STATIC_ANALYZER
   CLANG_PLUGIN_SUPPORT
diff --git a/clang/test/Driver/freebsd-mips-as.c 
b/clang/test/Driver/freebsd-mips-as.c
index a0872e49cb99d..8585d791460c9 100644
--- a/clang/test/Driver/freebsd-mips-as.c
+++ b/clang/test/Driver/freebsd-mips-as.c
@@ -1,7 +1,7 @@
 // Check passing options to the assembler for MIPS targets.
 //
 // RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as %if default-pie-on-freebsd %{ -fno-pic %} -c %s 
2>&1 \
+// RUN:   -no-integrated-as -fno-pic -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=MIPS32-EB-AS %s
 // MIPS32-EB-AS: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB"
 // MIPS32-EB-AS-NOT: "-KPIC"
@@ -86,7 +86,7 @@
 // MIPS-ALIAS-64R2: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-EB"
 //
 // RUN: %clang --target=mips-unknown-freebsd -### \
-// RUN:   -no-integrated-as %if default-pie-on-freebsd %{ -fno-pic %} -G0 -c 
%s 2>&1 \
+// RUN:   -no-integrated-as -fno-pic -G0 -c %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=MIPS32-EB-AS-G0 %s
 // MIPS32-EB-AS-G0: as{{(.exe)?}}" "-march" "mips2" "-mabi" "32" "-EB" "-G0"
 // MIPS32-EB-AS-G0-NOT: "-KPIC"
diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c
index 0caff10ca5e6c..001ac08fb8669 100644
--- a/clang/test/Driver/freebsd.c
+++ b/clang/test/Driver/freebsd.c
@@ -1,13 +1,19 @@
+/// PIE is the default on FreeBSD >= 13.1 (and unversioned triples); earlier
+/// releases default to non-PIE.
+// RUN: %clang \
+// RUN:   --target=aarch64-pc-freebsd14 %s                              \
+// RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-ARM64-PIE %s
+
 // RUN: %clang \
 // RUN:   --target=aarch64-pc-freebsd11 %s                              \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-ARM64-PIE %s %} \
-// RUN:   %else %{ | FileCheck --check-prefix=CHECK-ARM64 %s %}
+// 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"
 
-// CHECK-ARM64-PIE: "-cc1" "-triple" "aarch64-pc-freebsd11"
+// CHECK-ARM64-PIE: "-cc1" "-triple" "aarch64-pc-freebsd{{[0-9]+}}"
 // CHECK-ARM64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
 // CHECK-ARM64-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}"  
"--enable-new-dtags" "-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"
 
@@ -28,11 +34,7 @@
 // RUN: %clang \
 // RUN:   --target=powerpc-pc-freebsd %s    \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd_tree -### 2>&1 \
-// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-PPC-PIE %s %} \
-// RUN:   %else %{ | FileCheck --check-prefix=CHECK-PPC %s %}
-// CHECK-PPC: "-cc1" "-triple" "powerpc-pc-freebsd"
-// CHECK-PPC: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-PPC: "--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:   | FileCheck --check-prefix=CHECK-PPC-PIE %s
 
 // CHECK-PPC-PIE: "-cc1" "-triple" "powerpc-pc-freebsd"
 // CHECK-PPC-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
@@ -55,11 +57,7 @@
 // RUN: %clang \
 // RUN:   --target=powerpc64-pc-freebsd %s                              \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-PPC64-PIE %s %} \
-// RUN:   %else %{ | 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"
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64-PIE %s
 
 // CHECK-PPC64-PIE: "-cc1" "-triple" "powerpc64-pc-freebsd"
 // CHECK-PPC64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
@@ -81,8 +79,7 @@
 // RUN: %clang \
 // RUN:   --target=powerpc64le-unknown-freebsd13 %s \
 // RUN:   --sysroot=%S/Inputs/basic_freebsd64_tree -### 2>&1 \
-// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-PPC64LE-PIE %s %} \
-// RUN:   %else %{ | FileCheck --check-prefix=CHECK-PPC64LE %s %}
+// RUN:   | FileCheck --check-prefix=CHECK-PPC64LE %s
 // CHECK-PPC64LE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
 // CHECK-PPC64LE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-PPC64LE: "--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"
@@ -204,14 +201,14 @@
 // RUN: %clang --target=x86_64-pc-freebsd -static %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
 // RUN:   | FileCheck --check-prefix=CHECK-STATIC %s
-// CHECK-STATIC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
-// CHECK-STATIC: crt1.o
+// CHECK-STATIC: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "--eh-frame-hdr" 
"-Bstatic"
+// CHECK-STATIC: "[[SYSROOT]]/usr/lib/crt1.o"
 // CHECK-STATIC: crtbeginT.o
 
 // RUN: %clang --target=x86_64-pc-freebsd -shared %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
 // RUN:   | FileCheck --check-prefix=CHECK-SHARED %s
-// CHECK-SHARED: ld{{.*}}" "--eh-frame-hdr" "-shared"
+// CHECK-SHARED: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "--eh-frame-hdr" 
"-shared"
 // CHECK-SHARED: crti.o
 // CHECK-SHARED: crtbeginS.o
 
@@ -224,11 +221,7 @@
 
 // RUN: %clang --target=x86_64-pc-freebsd %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
-// RUN:   %if default-pie-on-freebsd %{ | FileCheck 
--check-prefix=CHECK-NORMAL-PIE %s %} \
-// RUN:   %else %{ | FileCheck --check-prefix=CHECK-NORMAL %s %}
-// CHECK-NORMAL: crt1.o
-// CHECK-NORMAL: crtbegin.o
-
+// RUN:   | FileCheck --check-prefix=CHECK-NORMAL-PIE %s
 // CHECK-NORMAL-PIE: Scrt1.o
 // CHECK-NORMAL-PIE: crtbeginS.o
 
@@ -238,17 +231,22 @@
 // CHECK-NORMAL-NOPIE: crt1.o
 // CHECK-NORMAL-NOPIE: crtbegin.o
 
-/// Test -DCLANG_DEFAULT_PIE_ON_FREEBSD=on.
+/// PIE is the default on FreeBSD >= 13.1 and on unversioned triples.
 // RUN: %clang -### --target=x86_64-unknown-freebsd %s 2>&1 \
-// RUN:   %if default-pie-on-freebsd %{ | FileCheck --check-prefix=PIE2 %s %} \
-// RUN:   %else %{ | FileCheck --check-prefix=PIE2-OFF %s %}
+// 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"
 
-// PIE2-OFF: "-mrelocation-model" "static"
-// PIE2-OFF-NOT: "-pic-is-pie"
-// PIE2-OFF-NOT: "-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 -### %s --target=arm-unknown-freebsd10.0 -no-integrated-as 2>&1 
\
 // RUN:   | FileCheck --check-prefix=CHECK-ARM %s
diff --git a/clang/test/Driver/hie-fpie-option-freebsd.hip 
b/clang/test/Driver/hip-fpie-option-freebsd.hip
similarity index 97%
rename from clang/test/Driver/hie-fpie-option-freebsd.hip
rename to clang/test/Driver/hip-fpie-option-freebsd.hip
index 24dd3c4440062..5168149778e8a 100644
--- a/clang/test/Driver/hie-fpie-option-freebsd.hip
+++ b/clang/test/Driver/hip-fpie-option-freebsd.hip
@@ -1,5 +1,3 @@
-// REQUIRES: default-pie-on-freebsd
-
 // -fPIC and -fPIE only affects host relocation model.
 // device compilation always uses PIC. 
 
diff --git a/clang/test/lit.cfg.py b/clang/test/lit.cfg.py
index 6013dfb6ad765..5a5e819c9b5a1 100644
--- a/clang/test/lit.cfg.py
+++ b/clang/test/lit.cfg.py
@@ -337,9 +337,6 @@ def have_host_clang_repl_cuda():
 if config.has_plugins and config.llvm_plugin_ext:
     config.available_features.add("plugins")
 
-if config.clang_default_pie_on_freebsd:
-    config.available_features.add("default-pie-on-freebsd")
-
 if config.clang_default_pie_on_linux:
     config.available_features.add("default-pie-on-linux")
 
diff --git a/clang/test/lit.site.cfg.py.in b/clang/test/lit.site.cfg.py.in
index 0ddca8452da23..cb35118167d99 100644
--- a/clang/test/lit.site.cfg.py.in
+++ b/clang/test/lit.site.cfg.py.in
@@ -21,7 +21,6 @@ config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
 config.have_zlib = @LLVM_ENABLE_ZLIB@
 config.have_zstd = @LLVM_ENABLE_ZSTD@
 config.clang_objc_rewriter = @CLANG_ENABLE_OBJC_REWRITER@
-config.clang_default_pie_on_freebsd = @CLANG_DEFAULT_PIE_ON_FREEBSD@
 config.clang_default_pie_on_linux = @CLANG_DEFAULT_PIE_ON_LINUX@
 config.clang_default_cxx_stdlib = "@CLANG_DEFAULT_CXX_STDLIB@"
 config.clang_staticanalyzer = @CLANG_ENABLE_STATIC_ANALYZER@
diff --git a/flang/test/Driver/linker-options.f90 
b/flang/test/Driver/linker-options.f90
index 55909fe034394..45ff2ab774a20 100644
--- a/flang/test/Driver/linker-options.f90
+++ b/flang/test/Driver/linker-options.f90
@@ -24,7 +24,7 @@
 ! 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.
+! 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 \
@@ -58,7 +58,7 @@
 ! 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=PIE
 ! RUN: %flang -target i386-pc-freebsd -### %s 2>&1 \
diff --git a/flang/test/Driver/pic-flags.f90 b/flang/test/Driver/pic-flags.f90
index 34a13ed228101..618615af33c78 100644
--- a/flang/test/Driver/pic-flags.f90
+++ b/flang/test/Driver/pic-flags.f90
@@ -1,6 +1,6 @@
 ! RUN: %if aarch64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=aarch64-linux-gnu -fno-pie 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-STATIC,CHECK-STATIC-IR %}
 
-! RUN: %if x86_64-registered-target && clang_default_pie_on_freebsd %{ %flang 
-v -S -emit-llvm -o - %s --target=x86_64-unknown-freebsd 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
+! RUN: %if x86_64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=x86_64-unknown-freebsd 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
 ! RUN: %if aarch64-registered-target && clang_default_pie_on_linux %{ %flang 
-v -S -emit-llvm -o - %s --target=aarch64-linux-gnu 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
 ! RUN: %if aarch64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=aarch64-linux-gnu -fpie 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL1,CHECK-PIE-LEVEL1-IR %}
 ! RUN: %if aarch64-registered-target %{ %flang -v -S -emit-llvm -o - %s 
--target=aarch64-linux-gnu -fPIE 2>&1 | FileCheck %s 
--check-prefixes=CHECK,CHECK-PIE-LEVEL2,CHECK-PIE-LEVEL2-IR %}
diff --git a/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn 
b/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn
index c5b30e30fe76d..f8196d1b248e5 100644
--- a/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang/include/clang/Config/BUILD.gn
@@ -8,7 +8,6 @@ write_cmake_config("Config") {
   output = "$target_gen_dir/config.h"
   values = [
     "BUG_REPORT_URL=https://github.com/llvm/llvm-project/issues/";,
-    "CLANG_DEFAULT_PIE_ON_FREEBSD=1",
     "CLANG_DEFAULT_PIE_ON_LINUX=1",
     "CLANG_DEFAULT_LINKER=",
     "CLANG_DEFAULT_CXX_STDLIB=",
diff --git a/llvm/utils/gn/secondary/clang/test/BUILD.gn 
b/llvm/utils/gn/secondary/clang/test/BUILD.gn
index 1da3a1a3062b2..73f3bd020a1e0 100644
--- a/llvm/utils/gn/secondary/clang/test/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang/test/BUILD.gn
@@ -52,7 +52,6 @@ write_lit_config("lit_site_cfg") {
     "CLANG_BUILD_EXAMPLES=0",
     "CLANG_BUILT_STANDALONE=0",
     "CLANG_DEFAULT_CXX_STDLIB=",  # Empty string means "default value" here.
-    "CLANG_DEFAULT_PIE_ON_FREEBSD=0",
     "CLANG_DEFAULT_PIE_ON_LINUX=0",
     "CLANG_ENABLE_CIR=0",
     "CLANG_ENABLE_OBJC_REWRITER=0",
diff --git 
a/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h 
b/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h
index 0f01ac0e9ecbc..7f7308f338966 100644
--- a/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h
+++ b/utils/bazel/llvm-project-overlay/clang/include/clang/Config/config.h
@@ -22,9 +22,6 @@
 /* Bug report URL. */
 #define BUG_REPORT_URL "https://github.com/llvm/llvm-project/issues/";
 
-/* Default to -fPIE and -pie on FreeBSD. */
-#define CLANG_DEFAULT_PIE_ON_FREEBSD 1
-
 /* Default to -fPIE and -pie on Linux. */
 #define CLANG_DEFAULT_PIE_ON_LINUX 1
 

>From 666fb313efe720bcc5b6b8728dd8d0a1f9ef6e1f Mon Sep 17 00:00:00 2001
From: ShengYi Hung <[email protected]>
Date: Mon, 20 Jul 2026 21:09:52 +0800
Subject: [PATCH 4/4] fixup! [Clang] Switch to Default PIE on FreeBSD

---
 clang/test/Driver/freebsd.c                   | 20 +++++++++----------
 clang/test/Driver/hip-fpie-option-freebsd.hip | 10 ----------
 2 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c
index d62dd6a6bb620..f8656db5f22e1 100644
--- a/clang/test/Driver/freebsd.c
+++ b/clang/test/Driver/freebsd.c
@@ -14,8 +14,8 @@
 // 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"
 
 // CHECK-ARM64-PIE: "-cc1" "-triple" "aarch64-pc-freebsd{{[0-9]+}}"
-// CHECK-ARM64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
-// CHECK-ARM64-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}"  
"--enable-new-dtags" "-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"
+// 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 \
 // RUN:   --target=aarch64-pc-freebsd11 %s                              \
@@ -37,8 +37,8 @@
 // RUN:   | FileCheck --check-prefix=CHECK-PPC-PIE %s
 
 // CHECK-PPC-PIE: "-cc1" "-triple" "powerpc-pc-freebsd"
-// CHECK-PPC-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
-// CHECK-PPC-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-m" "elf32ppc_fbsd" "-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"
+// CHECK-PPC-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC-PIE: "--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 -pie \
 // RUN:   --target=powerpc-pc-freebsd %s    \
@@ -51,7 +51,7 @@
 // RUN:   | FileCheck --check-prefix=CHECK-PPC-NOPIE %s
 // CHECK-PPC-NOPIE: "-cc1" "-triple" "powerpc-pc-freebsd"
 // CHECK-PPC-NOPIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-PPC-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"
+// CHECK-PPC-NOPIE: "--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"
 
 //
 // RUN: %clang \
@@ -60,8 +60,8 @@
 // RUN:   | FileCheck --check-prefix=CHECK-PPC64-PIE %s
 
 // CHECK-PPC64-PIE: "-cc1" "-triple" "powerpc64-pc-freebsd"
-// CHECK-PPC64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
-// CHECK-PPC64-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-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"
+// CHECK-PPC64-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64-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 \
 // RUN:   --target=powerpc64-pc-freebsd %s                              \
@@ -83,8 +83,8 @@
 // CHECK-PPC64LE: "--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-PPC64LE-PIE: "-cc1" "-triple" "powerpc64le-unknown-freebsd13"
-// CHECK-PPC64LE-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "-pie"
-// CHECK-PPC64LE-PIE: "--eh-frame-hdr" "-dynamic-linker" "{{.*}}ld-elf{{.*}}" 
"--enable-new-dtags" "-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"
+// CHECK-PPC64LE-PIE: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-PPC64LE-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 \
 // RUN:   --target=powerpc64le-unknown-freebsd13 %s \
@@ -205,7 +205,7 @@
 // RUN: %clang --target=x86_64-pc-freebsd -shared %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
 // RUN:   | FileCheck --check-prefix=CHECK-SHARED %s
-// CHECK-SHARED: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" "--eh-frame-hdr" 
"-shared"
+// CHECK-SHARED: ld{{.*}}" "--eh-frame-hdr" "-shared"
 // CHECK-SHARED: crti.o
 // CHECK-SHARED: crtbeginS.o
 
diff --git a/clang/test/Driver/hip-fpie-option-freebsd.hip 
b/clang/test/Driver/hip-fpie-option-freebsd.hip
index 5168149778e8a..a1a0a45318481 100644
--- a/clang/test/Driver/hip-fpie-option-freebsd.hip
+++ b/clang/test/Driver/hip-fpie-option-freebsd.hip
@@ -19,16 +19,6 @@
 // RUN:   -fPIC \
 // RUN:   2>&1 | FileCheck -check-prefixes=DEV,HOST-PIC %s
 
-// RUN: %clang -### --target=x86_64-unknown-freebsd \
-// RUN:   --offload-arch=gfx906 %s -nogpulib -nogpuinc \
-// RUN:   -fPIE \
-// 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:   -fPIE \
-// RUN:   2>&1 | FileCheck -check-prefixes=DEV,HOST-PIE %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"

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to