aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorVictor Campos <victor.campos@arm.com>2025-04-25 11:04:34 +0100
committerGitHub <noreply@github.com>2025-04-25 11:04:34 +0100
commit6738cfe0a40af2754000346ff090ebb2115ce15f (patch)
treea151992b31997e761126b911f8eb84d194fe1957 /clang/lib
parenta4d1a9d6d5c44d37b926e675e6f707eb35b601b0 (diff)
downloadllvm-6738cfe0a40af2754000346ff090ebb2115ce15f.zip
llvm-6738cfe0a40af2754000346ff090ebb2115ce15f.tar.gz
llvm-6738cfe0a40af2754000346ff090ebb2115ce15f.tar.bz2
Mark CXX module initializer with PACBTI attributes (#133716)
The CXX module initializer function, which is called at program startup, needs to be tagged with Pointer Authentication and Branch Target Identification marks whenever relevant. Before this patch, in CPUs set up for PACBTI execution, the function wasn't protected with return address signing and no BTI instruction was inserted at the start of it, thus leading to an execution fault. This patch fixes the issue by marking the function with the function attributes related to PAC and BTI if relevant.
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGDeclCXX.cpp5
-rw-r--r--clang/lib/CodeGen/Targets/AArch64.cpp9
-rw-r--r--clang/lib/CodeGen/Targets/ARM.cpp15
3 files changed, 17 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp
index 303d21e..8a214da 100644
--- a/clang/lib/CodeGen/CGDeclCXX.cpp
+++ b/clang/lib/CodeGen/CGDeclCXX.cpp
@@ -448,6 +448,11 @@ llvm::Function *CodeGenModule::CreateGlobalInitOrCleanUpFunction(
if (Linkage == llvm::GlobalVariable::InternalLinkage)
SetInternalFunctionAttributes(GlobalDecl(), Fn, FI);
+ else {
+ SetLLVMFunctionAttributes(GlobalDecl(), FI, Fn, false);
+ SetLLVMFunctionAttributesForDefinition(nullptr, Fn);
+ getTargetCodeGenInfo().setTargetAttributes(nullptr, Fn, *this);
+ }
Fn->setCallingConv(getRuntimeCC());
diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp
index 77e225d..f098f09e 100644
--- a/clang/lib/CodeGen/Targets/AArch64.cpp
+++ b/clang/lib/CodeGen/Targets/AArch64.cpp
@@ -136,13 +136,15 @@ public:
void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
CodeGen::CodeGenModule &CGM) const override {
- const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
- if (!FD)
+ auto *Fn = dyn_cast<llvm::Function>(GV);
+ if (!Fn)
return;
+ const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
TargetInfo::BranchProtectionInfo BPI(CGM.getLangOpts());
- if (const auto *TA = FD->getAttr<TargetAttr>()) {
+ if (FD && FD->hasAttr<TargetAttr>()) {
+ const auto *TA = FD->getAttr<TargetAttr>();
ParsedTargetAttr Attr =
CGM.getTarget().parseTargetAttr(TA->getFeaturesStr());
if (!Attr.BranchProtection.empty()) {
@@ -152,7 +154,6 @@ public:
assert(Error.empty());
}
}
- auto *Fn = cast<llvm::Function>(GV);
setBranchProtectionFnAttributes(BPI, *Fn);
}
diff --git a/clang/lib/CodeGen/Targets/ARM.cpp b/clang/lib/CodeGen/Targets/ARM.cpp
index dddf51a..68f9e01 100644
--- a/clang/lib/CodeGen/Targets/ARM.cpp
+++ b/clang/lib/CodeGen/Targets/ARM.cpp
@@ -134,14 +134,13 @@ public:
void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
CodeGen::CodeGenModule &CGM) const override {
- if (GV->isDeclaration())
+ auto *Fn = dyn_cast<llvm::Function>(GV);
+ if (!Fn)
return;
- const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
- if (!FD)
- return;
- auto *Fn = cast<llvm::Function>(GV);
+ const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
- if (const auto *TA = FD->getAttr<TargetAttr>()) {
+ if (FD && FD->hasAttr<TargetAttr>()) {
+ const auto *TA = FD->getAttr<TargetAttr>();
ParsedTargetAttr Attr =
CGM.getTarget().parseTargetAttr(TA->getFeaturesStr());
if (!Attr.BranchProtection.empty()) {
@@ -174,10 +173,10 @@ public:
setBranchProtectionFnAttributes(BPI, (*Fn));
}
- const ARMInterruptAttr *Attr = FD->getAttr<ARMInterruptAttr>();
- if (!Attr)
+ if (!FD || !FD->hasAttr<ARMInterruptAttr>())
return;
+ const ARMInterruptAttr *Attr = FD->getAttr<ARMInterruptAttr>();
const char *Kind;
switch (Attr->getInterrupt()) {
case ARMInterruptAttr::Generic: Kind = ""; break;