aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorZixu Wang <9819235+zixu-w@users.noreply.github.com>2023-12-07 17:40:58 -0800
committerGitHub <noreply@github.com>2023-12-07 17:40:58 -0800
commit6e1f19168bca7e3bd4eefda50ba03eac8441dbbf (patch)
tree17a62cfb3c1090fe3443ac56ee9437bf95b4bd27 /clang/lib
parentc502a81b439b68cb029e16ca9d444d897b5e7727 (diff)
downloadllvm-6e1f19168bca7e3bd4eefda50ba03eac8441dbbf.zip
llvm-6e1f19168bca7e3bd4eefda50ba03eac8441dbbf.tar.gz
llvm-6e1f19168bca7e3bd4eefda50ba03eac8441dbbf.tar.bz2
[clang][PP] Add extension to predefine target OS macros (#74676)
Add an extension feature `define-target-os-macros` that enables clang to provide definitions of common TARGET_OS_* conditional macros. The extension is enabled in the Darwin toolchain driver.
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp3
-rw-r--r--clang/lib/Driver/ToolChains/Darwin.cpp4
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp7
-rw-r--r--clang/lib/Frontend/InitPreprocessor.cpp9
4 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index f02f7c84..eb26bfad 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1294,6 +1294,9 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-source-date-epoch");
CmdArgs.push_back(Args.MakeArgString(Epoch));
}
+
+ Args.addOptInFlag(CmdArgs, options::OPT_fdefine_target_os_macros,
+ options::OPT_fno_define_target_os_macros);
}
// FIXME: Move to target hook.
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index f09bc27..d3005d6 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -2916,6 +2916,10 @@ void Darwin::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
// to fix the same problem with C++ headers, and is generally fragile.
if (!sdkSupportsBuiltinModules(TargetPlatform, SDKInfo))
CC1Args.push_back("-fbuiltin-headers-in-system-modules");
+
+ if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
+ options::OPT_fno_define_target_os_macros))
+ CC1Args.push_back("-fdefine-target-os-macros");
}
void Darwin::addClangCC1ASTargetOptions(
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 56de0f7..b33bdad 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4365,6 +4365,9 @@ static void GeneratePreprocessorArgs(const PreprocessorOptions &Opts,
if (Opts.SourceDateEpoch)
GenerateArg(Consumer, OPT_source_date_epoch, Twine(*Opts.SourceDateEpoch));
+ if (Opts.DefineTargetOSMacros)
+ GenerateArg(Consumer, OPT_fdefine_target_os_macros);
+
// Don't handle LexEditorPlaceholders. It is implied by the action that is
// generated elsewhere.
}
@@ -4463,6 +4466,10 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
if (isStrictlyPreprocessorAction(Action))
Opts.LexEditorPlaceholders = false;
+ Opts.DefineTargetOSMacros =
+ Args.hasFlag(OPT_fdefine_target_os_macros,
+ OPT_fno_define_target_os_macros, Opts.DefineTargetOSMacros);
+
return Diags.getNumErrors() == NumErrorsBefore;
}
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 16a2947..d83128a 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -1351,6 +1351,15 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
if (TI.getTriple().isOSBinFormatELF())
Builder.defineMacro("__ELF__");
+ // Target OS macro definitions.
+ if (PPOpts.DefineTargetOSMacros) {
+ const llvm::Triple &Triple = TI.getTriple();
+#define TARGET_OS(Name, Predicate) \
+ Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
+#include "clang/Basic/TargetOSMacros.def"
+#undef TARGET_OS
+ }
+
// Get other target #defines.
TI.getTargetDefines(LangOpts, Builder);
}