Index: include/clang/Basic/LangOptions.def =================================================================== --- include/clang/Basic/LangOptions.def +++ include/clang/Basic/LangOptions.def @@ -160,6 +160,8 @@ VALUE_LANGOPT(AlignDouble , 1, 0, "Controls if doubles should be aligned to 8 bytes (x86 only)") COMPATIBLE_VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level") COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie") +LANGOPT(ROPI , 1, 0, "Read-only position independence") +LANGOPT(RWPI , 1, 0, "Read-write position independence") COMPATIBLE_LANGOPT(GNUInline , 1, 0, "GNU inline semantics") COMPATIBLE_LANGOPT(NoInlineDefine , 1, 0, "__NO_INLINE__ predefined macro") COMPATIBLE_LANGOPT(Deprecated , 1, 0, "__DEPRECATED predefined macro") 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_EQ : Joined<["-"], "fplugin=">, Group, Flags<[DriverOption]>, MetaVarName<"">, HelpText<"Load the named plugin (dynamic shared object)">; 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: 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/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: 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