diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 708fb7f0b82e..3811a87aaf46 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1703,6 +1703,20 @@ 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_frontend.F90 b/flang/test/Preprocessing/defines_pic_frontend.F90 new file mode 100644 index 000000000000..ad871e0acfab --- /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__