[flang-commits] [flang] [Flang][Driver] Predefine pic/pie macros based on configured level (PR #153449)

Ian McInerney via flang-commits flang-commits at lists.llvm.org
Thu Aug 14 07:58:28 PDT 2025


https://github.com/imciner2 updated https://github.com/llvm/llvm-project/pull/153449

>From 50ebbb0103aabc36ac13a70992b079496bc218ca Mon Sep 17 00:00:00 2001
From: Ian McInerney <i.mcinerney17 at imperial.ac.uk>
Date: Wed, 13 Aug 2025 17:32:57 +0100
Subject: [PATCH 1/3] [Flang][Driver] Predefine pic/pie macros based on
 configured level

Predefine the __pic__/__pie__/__PIC__/__PIE__ macros based on the
configured relocation level. This logic mirrors that of the clang
driver, where __pic__/__PIC__ are defined for both PIC and PIE modes,
but __pie__/__PIE__ are only defined for PIE mode.
---
 flang/lib/Frontend/CompilerInvocation.cpp     | 10 +++++
 .../Preprocessing/defines_pic_compiler.F90    | 31 +++++++++++++++
 .../Preprocessing/defines_pic_frontend.F90    | 38 +++++++++++++++++++
 3 files changed, 79 insertions(+)
 create mode 100644 flang/test/Preprocessing/defines_pic_compiler.F90
 create mode 100644 flang/test/Preprocessing/defines_pic_frontend.F90

diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 111c5aa48726f..7ea11a0809104 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1696,6 +1696,16 @@ void CompilerInvocation::setDefaultPredefinitions() {
   fortranOptions.predefinitions.emplace_back("__flang_patchlevel__",
                                              FLANG_VERSION_PATCHLEVEL_STRING);
 
+  // Add predefinitions based on the relocation model
+  if (unsigned PICLevel = getCodeGenOpts().PICLevel) {
+    fortranOptions.predefinitions.emplace_back("__PIC__", std::to_string(PICLevel));
+    fortranOptions.predefinitions.emplace_back("__pic__", std::to_string(PICLevel));
+    if (getCodeGenOpts().IsPIE) {
+      fortranOptions.predefinitions.emplace_back("__PIE__", std::to_string(PICLevel));
+      fortranOptions.predefinitions.emplace_back("__pie__", std::to_string(PICLevel));
+    }
+  }
+
   // Add predefinitions based on extensions enabled
   if (frontendOptions.features.IsEnabled(
           Fortran::common::LanguageFeature::OpenACC)) {
diff --git a/flang/test/Preprocessing/defines_pic_compiler.F90 b/flang/test/Preprocessing/defines_pic_compiler.F90
new file mode 100644
index 0000000000000..9b17f329a56d5
--- /dev/null
+++ b/flang/test/Preprocessing/defines_pic_compiler.F90
@@ -0,0 +1,31 @@
+! Check that the pie/pic/PIE/PIC macros are defined properly through the compiler driver
+
+! RUN: %flang -fpic -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIC1 %s
+! CHECK-PIC1: #define __PIC__ 1
+! CHECK-PIC1-NOT: #define __PIE__
+! CHECK-PIC1: #define __pic__ 1
+! CHECK-PIC1-NOT: #define __pie__
+!
+! RUN: %flang -fPIC -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIC2 %s
+! CHECK-PIC2: #define __PIC__ 2
+! CHECK-PIC2-NOT: #define __PIE__
+! CHECK-PIC2: #define __pic__ 2
+! CHECK-PIC2-NOT: #define __pie__
+!
+! RUN: %flang -fpie -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIE1 %s
+! CHECK-PIE1: #define __PIC__ 1
+! CHECK-PIE1: #define __PIE__ 1
+! CHECK-PIE1: #define __pic__ 1
+! CHECK-PIE1: #define __pie__ 1
+!
+! RUN: %flang -fPIE -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIE2 %s
+! CHECK-PIE2: #define __PIC__ 2
+! CHECK-PIE2: #define __PIE__ 2
+! CHECK-PIE2: #define __pic__ 2
+! CHECK-PIE2: #define __pie__ 2
+
+integer, parameter :: pic_level = __pic__
diff --git a/flang/test/Preprocessing/defines_pic_frontend.F90 b/flang/test/Preprocessing/defines_pic_frontend.F90
new file mode 100644
index 0000000000000..ad871e0acfab3
--- /dev/null
+++ b/flang/test/Preprocessing/defines_pic_frontend.F90
@@ -0,0 +1,38 @@
+! Check that the pie/pic/PIE/PIC macros are defined properly through the frontend driver
+
+! RUN: %flang_fc1 -dM -E -o - %s \
+! RUN:   | FileCheck %s
+! CHECK-NOT: #define __PIC__
+! CHECK-NOT: #define __PIE__
+! CHECK-NOT: #define __pic__
+! CHECK-NOT: #define __pie__
+!
+! RUN: %flang_fc1 -pic-level 1 -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIC1 %s
+! CHECK-PIC1: #define __PIC__ 1
+! CHECK-PIC1-NOT: #define __PIE__
+! CHECK-PIC1: #define __pic__ 1
+! CHECK-PIC1-NOT: #define __pie__
+!
+! RUN: %flang_fc1 -pic-level 2 -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIC2 %s
+! CHECK-PIC2: #define __PIC__ 2
+! CHECK-PIC2-NOT: #define __PIE__
+! CHECK-PIC2: #define __pic__ 2
+! CHECK-PIC2-NOT: #define __pie__
+!
+! RUN: %flang_fc1 -pic-level 1 -pic-is-pie -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIE1 %s
+! CHECK-PIE1: #define __PIC__ 1
+! CHECK-PIE1: #define __PIE__ 1
+! CHECK-PIE1: #define __pic__ 1
+! CHECK-PIE1: #define __pie__ 1
+!
+! RUN: %flang_fc1 -pic-level 2 -pic-is-pie -dM -E -o - %s \
+! RUN:   | FileCheck --check-prefix=CHECK-PIE2 %s
+! CHECK-PIE2: #define __PIC__ 2
+! CHECK-PIE2: #define __PIE__ 2
+! CHECK-PIE2: #define __pic__ 2
+! CHECK-PIE2: #define __pie__ 2
+
+integer, parameter :: pic_level = __pic__

>From 8994077ba1a868c0c9b780ad0422d1a9ac1e9ad8 Mon Sep 17 00:00:00 2001
From: Ian McInerney <i.mcinerney17 at imperial.ac.uk>
Date: Wed, 13 Aug 2025 17:47:18 +0100
Subject: [PATCH 2/3] fixup! [Flang][Driver] Predefine pic/pie macros based on
 configured level

---
 flang/lib/Frontend/CompilerInvocation.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 7ea11a0809104..09ddfed80401a 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1698,11 +1698,15 @@ void CompilerInvocation::setDefaultPredefinitions() {
 
   // Add predefinitions based on the relocation model
   if (unsigned PICLevel = getCodeGenOpts().PICLevel) {
-    fortranOptions.predefinitions.emplace_back("__PIC__", std::to_string(PICLevel));
-    fortranOptions.predefinitions.emplace_back("__pic__", std::to_string(PICLevel));
+    fortranOptions.predefinitions.emplace_back("__PIC__",
+                                               std::to_string(PICLevel));
+    fortranOptions.predefinitions.emplace_back("__pic__",
+                                               std::to_string(PICLevel));
     if (getCodeGenOpts().IsPIE) {
-      fortranOptions.predefinitions.emplace_back("__PIE__", std::to_string(PICLevel));
-      fortranOptions.predefinitions.emplace_back("__pie__", std::to_string(PICLevel));
+      fortranOptions.predefinitions.emplace_back("__PIE__",
+                                                 std::to_string(PICLevel));
+      fortranOptions.predefinitions.emplace_back("__pie__",
+                                                 std::to_string(PICLevel));
     }
   }
 

>From b8d541a8fa9f74260706ea522004321f1c965b67 Mon Sep 17 00:00:00 2001
From: Ian McInerney <i.mcinerney17 at imperial.ac.uk>
Date: Thu, 14 Aug 2025 15:58:08 +0100
Subject: [PATCH 3/3] fixup! fixup! [Flang][Driver] Predefine pic/pie macros
 based on configured level

---
 .../Preprocessing/defines_pic_compiler.F90    | 31 -------------------
 1 file changed, 31 deletions(-)
 delete mode 100644 flang/test/Preprocessing/defines_pic_compiler.F90

diff --git a/flang/test/Preprocessing/defines_pic_compiler.F90 b/flang/test/Preprocessing/defines_pic_compiler.F90
deleted file mode 100644
index 9b17f329a56d5..0000000000000
--- a/flang/test/Preprocessing/defines_pic_compiler.F90
+++ /dev/null
@@ -1,31 +0,0 @@
-! Check that the pie/pic/PIE/PIC macros are defined properly through the compiler driver
-
-! RUN: %flang -fpic -dM -E -o - %s \
-! RUN:   | FileCheck --check-prefix=CHECK-PIC1 %s
-! CHECK-PIC1: #define __PIC__ 1
-! CHECK-PIC1-NOT: #define __PIE__
-! CHECK-PIC1: #define __pic__ 1
-! CHECK-PIC1-NOT: #define __pie__
-!
-! RUN: %flang -fPIC -dM -E -o - %s \
-! RUN:   | FileCheck --check-prefix=CHECK-PIC2 %s
-! CHECK-PIC2: #define __PIC__ 2
-! CHECK-PIC2-NOT: #define __PIE__
-! CHECK-PIC2: #define __pic__ 2
-! CHECK-PIC2-NOT: #define __pie__
-!
-! RUN: %flang -fpie -dM -E -o - %s \
-! RUN:   | FileCheck --check-prefix=CHECK-PIE1 %s
-! CHECK-PIE1: #define __PIC__ 1
-! CHECK-PIE1: #define __PIE__ 1
-! CHECK-PIE1: #define __pic__ 1
-! CHECK-PIE1: #define __pie__ 1
-!
-! RUN: %flang -fPIE -dM -E -o - %s \
-! RUN:   | FileCheck --check-prefix=CHECK-PIE2 %s
-! CHECK-PIE2: #define __PIC__ 2
-! CHECK-PIE2: #define __PIE__ 2
-! CHECK-PIE2: #define __pic__ 2
-! CHECK-PIE2: #define __pie__ 2
-
-integer, parameter :: pic_level = __pic__



More information about the flang-commits mailing list