olista01 created this revision.
olista01 added reviewers: rengolin, t.p.northover.
olista01 added a subscriber: cfe-commits.
olista01 set the repository for this revision to rL LLVM.
Herald added subscribers: samparker, rengolin, aemerson.
This adds pre-defined macros to test for code being compiled in the FPIC, ROPI
and RWPI position-independence modes. The names of the macros match those used
by armcc, which also implements all of the PIC modes.
Repository:
rL LLVM
https://reviews.llvm.org/D23610
Files:
include/clang/Basic/LangOptions.def
include/clang/Driver/Options.td
lib/Basic/Targets.cpp
lib/Driver/Tools.cpp
lib/Frontend/CompilerInvocation.cpp
test/Preprocessor/arm-pic-predefines.c
Index: test/Preprocessor/arm-pic-predefines.c
===
--- /dev/null
+++ test/Preprocessor/arm-pic-predefines.c
@@ -0,0 +1,20 @@
+// REQUIRES: aarch64-registered-target
+// REQUIRES: arm-registered-target
+//
+// RUN: %clang -target armv8--none-eabi -x c -E -dM %s -o - | FileCheck %s --check-prefix=NO-FPIC --check-prefix=NO-ROPI --check-prefix=NO-RWPI
+// RUN: %clang -target armv8--none-eabi -x c -E -dM %s -o - -fpic | FileCheck %s --check-prefix=FPIC--check-prefix=NO-ROPI --check-prefix=NO-RWPI
+// RUN: %clang -target armv8--none-eabi -x c -E -dM %s -o - -fropi| FileCheck %s --check-prefix=NO-FPIC --check-prefix=ROPI--check-prefix=NO-RWPI
+// RUN: %clang -target armv8--none-eabi -x c -E -dM %s -o - -frwpi| FileCheck %s --check-prefix=NO-FPIC --check-prefix=NO-ROPI --check-prefix=RWPI
+// RUN: %clang -target armv8--none-eabi -x c -E -dM %s -o - -fropi -frwpi | FileCheck %s --check-prefix=NO-FPIC --check-prefix=ROPI--check-prefix=RWPI
+// RUN: %clang -target aarch64--none-eabi -x c -E -dM %s -o - -fpic | FileCheck %s --check-prefix=FPIC--check-prefix=NO-ROPI --check-prefix=NO-RWPI
+
+// Pre-defined macros for position-independence modes
+
+// NO-FPIC-NOT: #define __APCS_FPIC
+// FPIC: #define __APCS_FPIC
+
+// NO-ROPI-NOT: #define __APCS_ROPI
+// ROPI: #define __APCS_ROPI
+
+// NO-RWPI-NOT: #define __APCS_RWPI
+// RWPI: #define __APCS_RWPI
Index: lib/Frontend/CompilerInvocation.cpp
===
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -1933,6 +1933,8 @@
Opts.MaxTypeAlign = getLastArgIntValue(Args, OPT_fmax_type_align_EQ, 0, Diags);
Opts.AlignDouble = Args.hasArg(OPT_malign_double);
Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
+ Opts.ROPI = Args.hasArg(OPT_fropi);
+ Opts.RWPI = Args.hasArg(OPT_frwpi);
Opts.PIE = Args.hasArg(OPT_pic_is_pie);
Opts.Static = Args.hasArg(OPT_static_define);
Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
Index: lib/Driver/Tools.cpp
===
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -4143,6 +4143,12 @@
if (IsPIE)
CmdArgs.push_back("-pic-is-pie");
}
+ if (RelocationModel == llvm::Reloc::ROPI ||
+ RelocationModel == llvm::Reloc::ROPI_RWPI)
+CmdArgs.push_back("-fropi");
+ if (RelocationModel == llvm::Reloc::RWPI ||
+ RelocationModel == llvm::Reloc::ROPI_RWPI)
+CmdArgs.push_back("-frwpi");
if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
CmdArgs.push_back("-meabi");
Index: lib/Basic/Targets.cpp
===
--- lib/Basic/Targets.cpp
+++ lib/Basic/Targets.cpp
@@ -5311,6 +5311,13 @@
if (ArchKind == llvm::ARM::AK_ARMV8_1A)
Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
+
+if (Opts.PICLevel)
+ Builder.defineMacro("__APCS_FPIC", "1");
+if (Opts.ROPI)
+ Builder.defineMacro("__APCS_ROPI", "1");
+if (Opts.RWPI)
+ Builder.defineMacro("__APCS_RWPI", "1");
}
ArrayRef getTargetBuiltins() const override {
@@ -5830,6 +5837,9 @@
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
+
+if (Opts.PICLevel)
+ Builder.defineMacro("__APCS_FPIC", "1");
}
ArrayRef getTargetBuiltins() const override {
Index: include/clang/Driver/Options.td
===
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -1089,9 +1089,9 @@
def fno_pic : Flag<["-"], "fno-pic">, Group;
def fpie : Flag<["-"], "fpie">, Group;
def fno_pie : Flag<["-"], "fno-pie">, Group;
-def fropi : Flag<["-"], "fropi">, Group;
+def fropi : Flag<["-"], "fropi">, Group, Flags<[CC1Option]>;
def fno_ropi : Flag<["-"], "fno-ropi">, Group;
-def frwpi : Flag<["-"], "frwpi">, Group;
+def frwpi : Flag<["-"], "frwpi">, Group, Flags<[CC1Option]>;
def fno_rwpi : Flag<["-"], "fno-rwpi">, Group;
def fplugin_