[clang] [Clang][RISCV] Support -fcf-protection=return for RISC-V (PR #112477)
Jesse Huang via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 24 01:22:15 PDT 2024
https://github.com/jaidTw updated https://github.com/llvm/llvm-project/pull/112477
>From fe4a28fb691b69d9af384f1dc2f0667761adef44 Mon Sep 17 00:00:00 2001
From: Jesse Huang <jesse.huang at sifive.com>
Date: Sun, 13 Oct 2024 15:11:06 +0800
Subject: [PATCH 1/3] [Clang][RISCV] Support -fcf-protection=return for RISC-V
---
clang/lib/Basic/Targets/RISCV.h | 7 +++++++
clang/lib/CodeGen/CodeGenFunction.cpp | 4 ++++
2 files changed, 11 insertions(+)
diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h
index bf40edb8683b3e..3f2cee72fc3731 100644
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -141,6 +141,13 @@ class RISCVTargetInfo : public TargetInfo {
return true;
}
+ bool
+ checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const override {
+ if (ISAInfo->hasExtension("zimop"))
+ return true;
+ return TargetInfo::checkCFProtectionReturnSupported(Diags);
+ }
+
CFBranchLabelSchemeKind getDefaultCFBranchLabelScheme() const override {
return CFBranchLabelSchemeKind::FuncSig;
}
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 2306043c90f406..d8f0f7c14f6b40 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -899,6 +899,10 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
if (CodeGenOpts.PointerAuth.IndirectGotos)
Fn->addFnAttr("ptrauth-indirect-gotos");
+ // Add return control flow integrity attributes.
+ if (CodeGenOpts.CFProtectionReturn)
+ Fn->addFnAttr("hw-shadow-stack");
+
// Apply xray attributes to the function (as a string, for now)
bool AlwaysXRayAttr = false;
if (const auto *XRayAttr = D ? D->getAttr<XRayInstrumentAttr>() : nullptr) {
>From 7dc168af5758d130042c71ba5d6249c042bc356c Mon Sep 17 00:00:00 2001
From: Jesse Huang <jesse.huang at sifive.com>
Date: Wed, 23 Oct 2024 14:42:35 +0800
Subject: [PATCH 2/3] [Clang][RISCV] Add RISCV check for hw-shadow-stack
---
clang/lib/CodeGen/CodeGenFunction.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index d8f0f7c14f6b40..cca52f3769845e 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -899,8 +899,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
if (CodeGenOpts.PointerAuth.IndirectGotos)
Fn->addFnAttr("ptrauth-indirect-gotos");
- // Add return control flow integrity attributes.
- if (CodeGenOpts.CFProtectionReturn)
+ // Add return control flow integrity attributes for RISCV.
+ if (CodeGenOpts.CFProtectionReturn &&
+ getContext().getTargetInfo().getTriple().isRISCV())
Fn->addFnAttr("hw-shadow-stack");
// Apply xray attributes to the function (as a string, for now)
>From bb59a7064d2a5dc11c690b9262d09202c6942189 Mon Sep 17 00:00:00 2001
From: Jesse Huang <jesse.huang at sifive.com>
Date: Thu, 24 Oct 2024 15:39:07 +0800
Subject: [PATCH 3/3] [Clang][RISCV] Add function attribute in RISC-V specific
code
---
clang/lib/CodeGen/CodeGenFunction.cpp | 5 -----
clang/lib/CodeGen/Targets/RISCV.cpp | 4 ++++
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index cca52f3769845e..2306043c90f406 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -899,11 +899,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
if (CodeGenOpts.PointerAuth.IndirectGotos)
Fn->addFnAttr("ptrauth-indirect-gotos");
- // Add return control flow integrity attributes for RISCV.
- if (CodeGenOpts.CFProtectionReturn &&
- getContext().getTargetInfo().getTriple().isRISCV())
- Fn->addFnAttr("hw-shadow-stack");
-
// Apply xray attributes to the function (as a string, for now)
bool AlwaysXRayAttr = false;
if (const auto *XRayAttr = D ? D->getAttr<XRayInstrumentAttr>() : nullptr) {
diff --git a/clang/lib/CodeGen/Targets/RISCV.cpp b/clang/lib/CodeGen/Targets/RISCV.cpp
index fd72fe673b9b14..10779f397d1810 100644
--- a/clang/lib/CodeGen/Targets/RISCV.cpp
+++ b/clang/lib/CodeGen/Targets/RISCV.cpp
@@ -607,6 +607,10 @@ class RISCVTargetCodeGenInfo : public TargetCodeGenInfo {
auto *Fn = cast<llvm::Function>(GV);
Fn->addFnAttr("interrupt", Kind);
+
+ if (CGM.getCodeGenOpts().CFProtectionReturn)
+ Fn->addFnAttr("hw-shadow-stack");
+
}
};
} // namespace
More information about the cfe-commits
mailing list