-
Notifications
You must be signed in to change notification settings - Fork 13.9k
[clang][X86] Only define __CET__ macro for X86 targets #127616
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The `-fcf-protection` flag is now also used to enable CFI features for the RISC-V target, so it's not suitable to define `__CET__` solely based on the flag anymore. This patch moves the definition of the `__CET__` macro into X86 target hook, so only X86 targets with the `-fcf-protection` flag would enable the `__CET__` macro.
@llvm/pr-subscribers-clang @llvm/pr-subscribers-backend-risc-v Author: Ming-Yi Lai (mylai-mtk) ChangesThe Full diff: https://github.com/llvm/llvm-project/pull/127616.diff 3 Files Affected:
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index 84a05cec04e7f..e4d3ad04fe9de 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -1109,6 +1109,10 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
if (HasFloat128)
Builder.defineMacro("__SIZEOF_FLOAT128__", "16");
+
+ if (Opts.CFProtectionReturn || Opts.CFProtectionBranch)
+ Builder.defineMacro("__CET__", Twine{(Opts.CFProtectionReturn << 1) |
+ Opts.CFProtectionBranch});
}
bool X86TargetInfo::isValidFeatureName(StringRef Name) const {
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index b9a5c0589ebc4..4eb743acf327f 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4776,17 +4776,6 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
}
}
- // Add the __CET__ macro if a CFProtection option is set.
- if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
- StringRef Name = A->getValue();
- if (Name == "branch")
- Opts.addMacroDef("__CET__=1");
- else if (Name == "return")
- Opts.addMacroDef("__CET__=2");
- else if (Name == "full")
- Opts.addMacroDef("__CET__=3");
- }
-
// Add macros from the command line.
for (const auto *A : Args.filtered(OPT_D, OPT_U)) {
if (A->getOption().matches(OPT_D))
diff --git a/clang/test/Preprocessor/riscv-cf-protection-return.c b/clang/test/Preprocessor/riscv-cf-protection-return.c
index 3a93a88fa6839..a4cbaa1edf68c 100644
--- a/clang/test/Preprocessor/riscv-cf-protection-return.c
+++ b/clang/test/Preprocessor/riscv-cf-protection-return.c
@@ -40,5 +40,7 @@
// RUN: -menable-experimental-extensions -fcf-protection=full -E -dM %s -o - \
// RUN: | FileCheck --check-prefixes=SHSTK-MACRO %s
+// SHSTK-MACRO-NOT: __CET__
// SHSTK-MACRO: __riscv_shadow_stack 1{{$}}
+// SHSTK-MACRO-NOT: __CET__
// NO-MACRO-NOT: __riscv_shadow_stack
|
Can you update the description to mention which PR makes RISCV targets inspect -fcf-protection=? |
Added PR links. Thanks! |
The
-fcf-protection
flag is now also used to enable CFI features for the RISC-V target, so it's not suitable to define__CET__
solely based on the flag anymore. This patch moves the definition of the__CET__
macro into X86 target hook, so only X86 targets with the-fcf-protection
flag would enable the__CET__
macro.