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.hu...@sifive.com> Date: Sun, 13 Oct 2024 15:11:06 +0800 Subject: [PATCH 1/5] [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.hu...@sifive.com> Date: Wed, 23 Oct 2024 14:42:35 +0800 Subject: [PATCH 2/5] [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 42132c2460333358f6c1aaa646266847a3b8c854 Mon Sep 17 00:00:00 2001 From: Jesse Huang <jesse.hu...@sifive.com> Date: Thu, 24 Oct 2024 15:39:07 +0800 Subject: [PATCH 3/5] [Clang][RISCV] Add function attribute in RISC-V specific code --- clang/lib/CodeGen/CodeGenFunction.cpp | 5 ----- clang/lib/CodeGen/Targets/RISCV.cpp | 7 +++++-- 2 files changed, 5 insertions(+), 7 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..b04e436c665f52 100644 --- a/clang/lib/CodeGen/Targets/RISCV.cpp +++ b/clang/lib/CodeGen/Targets/RISCV.cpp @@ -594,6 +594,11 @@ class RISCVTargetCodeGenInfo : public TargetCodeGenInfo { const auto *FD = dyn_cast_or_null<FunctionDecl>(D); if (!FD) return; + auto *Fn = cast<llvm::Function>(GV); + + if (CGM.getCodeGenOpts().CFProtectionReturn) + Fn->addFnAttr("hw-shadow-stack"); + const auto *Attr = FD->getAttr<RISCVInterruptAttr>(); if (!Attr) return; @@ -604,8 +609,6 @@ class RISCVTargetCodeGenInfo : public TargetCodeGenInfo { case RISCVInterruptAttr::machine: Kind = "machine"; break; } - auto *Fn = cast<llvm::Function>(GV); - Fn->addFnAttr("interrupt", Kind); } }; >From 62dff012e1791bac6b3ed7725df86c1b2c60c1a1 Mon Sep 17 00:00:00 2001 From: Jesse Huang <jesse.hu...@sifive.com> Date: Fri, 25 Oct 2024 14:13:45 +0800 Subject: [PATCH 4/5] [Clang] Add test for hw-shadodw-stack --- clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c diff --git a/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c b/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c new file mode 100644 index 00000000000000..80d20b03f9a913 --- /dev/null +++ b/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -triple riscv64-unknown-linux -target-feature +zimop -emit-llvm -o - %s -fcf-protection=return | FileCheck %s +// RUN: %clang_cc1 -triple riscv64-unknown-linux -target-feature +zimop -emit-llvm -o - %s | FileCheck -check-prefix=NOSHADOWSTACK %s +// RUN: %clang_cc1 -triple riscv32-unknown-linux -target-feature +zimop -emit-llvm -o - %s -fcf-protection=return | FileCheck %s +// RUN: %clang_cc1 -triple riscv32-unknown-linux -target-feature +zimop -emit-llvm -o - %s | FileCheck -check-prefix=NOSHADOWSTACK %s + +int foo(int *a) { return *a; } + +// CHECK: attributes {{.*}}"hw-shadow-stack"{{.*}} +// NOSHADOWSTACK-NOT: attributes {{.*}}"hw-shadow-stack"{{.*}} >From f2727246e6fb8298e1d1208dd89ae7598ac64610 Mon Sep 17 00:00:00 2001 From: Jesse Huang <jesse.hu...@sifive.com> Date: Mon, 28 Oct 2024 15:21:06 +0800 Subject: [PATCH 5/5] !fixup change requirement back to zicfiss --- clang/lib/Basic/Targets/RISCV.h | 2 +- clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h index 3f2cee72fc3731..3b418585ab4a39 100644 --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -143,7 +143,7 @@ class RISCVTargetInfo : public TargetInfo { bool checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const override { - if (ISAInfo->hasExtension("zimop")) + if (ISAInfo->hasExtension("zicfiss")) return true; return TargetInfo::checkCFProtectionReturnSupported(Diags); } diff --git a/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c b/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c index 80d20b03f9a913..cabff7e598eb02 100644 --- a/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c +++ b/clang/test/CodeGen/RISCV/attr-hw-shadow-stack.c @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -triple riscv64-unknown-linux -target-feature +zimop -emit-llvm -o - %s -fcf-protection=return | FileCheck %s -// RUN: %clang_cc1 -triple riscv64-unknown-linux -target-feature +zimop -emit-llvm -o - %s | FileCheck -check-prefix=NOSHADOWSTACK %s -// RUN: %clang_cc1 -triple riscv32-unknown-linux -target-feature +zimop -emit-llvm -o - %s -fcf-protection=return | FileCheck %s -// RUN: %clang_cc1 -triple riscv32-unknown-linux -target-feature +zimop -emit-llvm -o - %s | FileCheck -check-prefix=NOSHADOWSTACK %s +// RUN: %clang_cc1 -triple riscv64 -target-feature +experimental-zicfiss -emit-llvm -o - %s -fcf-protection=return | FileCheck %s +// RUN: %clang_cc1 -triple riscv64 -target-feature +experimental-zicfiss -emit-llvm -o - %s | FileCheck -check-prefix=NOSHADOWSTACK %s +// RUN: %clang_cc1 -triple riscv32 -target-feature +experimental-zicfiss -emit-llvm -o - %s -fcf-protection=return | FileCheck %s +// RUN: %clang_cc1 -triple riscv32 -target-feature +experimental-zicfiss -emit-llvm -o - %s | FileCheck -check-prefix=NOSHADOWSTACK %s int foo(int *a) { return *a; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits