diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index a01fa157c2b26..28f7ab10a85ee 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -447,6 +447,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 073ca3cc82690..449edd27ea07f 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -136,13 +136,15 @@ class AArch64TargetCodeGenInfo : public TargetCodeGenInfo { void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const override { - const FunctionDecl *FD = dyn_cast_or_null(D); - if (!FD) + auto *Fn = dyn_cast(GV); + if (!Fn) return; + const auto *FD = dyn_cast_or_null(D); TargetInfo::BranchProtectionInfo BPI(CGM.getLangOpts()); - if (const auto *TA = FD->getAttr()) { + if (FD && FD->hasAttr()) { + const auto *TA = FD->getAttr(); ParsedTargetAttr Attr = CGM.getTarget().parseTargetAttr(TA->getFeaturesStr()); if (!Attr.BranchProtection.empty()) { @@ -152,7 +154,6 @@ class AArch64TargetCodeGenInfo : public TargetCodeGenInfo { assert(Error.empty()); } } - auto *Fn = cast(GV); setBranchProtectionFnAttributes(BPI, *Fn); } diff --git a/clang/lib/CodeGen/Targets/ARM.cpp b/clang/lib/CodeGen/Targets/ARM.cpp index a6d9a5549355c..043fe642c239d 100644 --- a/clang/lib/CodeGen/Targets/ARM.cpp +++ b/clang/lib/CodeGen/Targets/ARM.cpp @@ -134,14 +134,13 @@ class ARMTargetCodeGenInfo : public TargetCodeGenInfo { void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const override { - if (GV->isDeclaration()) + auto *Fn = dyn_cast(GV); + if (!Fn) return; - const FunctionDecl *FD = dyn_cast_or_null(D); - if (!FD) - return; - auto *Fn = cast(GV); + const auto *FD = dyn_cast_or_null(D); - if (const auto *TA = FD->getAttr()) { + if (FD && FD->hasAttr()) { + const auto *TA = FD->getAttr(); ParsedTargetAttr Attr = CGM.getTarget().parseTargetAttr(TA->getFeaturesStr()); if (!Attr.BranchProtection.empty()) { @@ -174,10 +173,10 @@ class ARMTargetCodeGenInfo : public TargetCodeGenInfo { setBranchProtectionFnAttributes(BPI, (*Fn)); } - const ARMInterruptAttr *Attr = FD->getAttr(); - if (!Attr) + if (!FD || !FD->hasAttr()) return; + const ARMInterruptAttr *Attr = FD->getAttr(); const char *Kind; switch (Attr->getInterrupt()) { case ARMInterruptAttr::Generic: Kind = ""; break; diff --git a/clang/test/CodeGenCXX/cxx20-module-initializer-pacbti.cpp b/clang/test/CodeGenCXX/cxx20-module-initializer-pacbti.cpp new file mode 100644 index 0000000000000..dc66b0090e568 --- /dev/null +++ b/clang/test/CodeGenCXX/cxx20-module-initializer-pacbti.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple thumbv8.1m.main-unknown-none-eabi -emit-module-interface -target-feature +pacbti -msign-return-address=all -mbranch-target-enforce -std=c++20 %s -o %t.pcm +// RUN: %clang_cc1 -triple thumbv8.1m.main-unknown-none-eabi -std=c++20 %t.pcm -emit-llvm -o - | \ +// RUN: FileCheck --check-prefixes=CHECK,CHECK-PAC-ARM %s + +// RUN: %clang_cc1 -triple aarch64-unknown-none-elf -emit-module-interface -target-feature +pacbti -msign-return-address=all -msign-return-address-key=b_key -mbranch-target-enforce -std=c++20 %s -o %t.pcm +// RUN: %clang_cc1 -triple aarch64-unknown-none-elf -std=c++20 %t.pcm -emit-llvm -o - | \ +// RUN: FileCheck --check-prefixes=CHECK,CHECK-PAC-AARCH64 %s + +// CHECK: define void @_ZGIW3foo() #0 +// CHECK-PAC-ARM: attributes #0 = { noinline nounwind "branch-target-enforcement" "no-trapping-math"="true" "sign-return-address"="all" "sign-return-address-key"="a_key" "stack-protector-buffer-size"="8" "target-features"="+armv8.1-m.main,+pacbti,+thumb-mode" } +// CHECK-PAC-AARCH64: attributes #0 = { noinline nounwind "branch-target-enforcement" "no-trapping-math"="true" "sign-return-address"="all" "sign-return-address-key"="b_key" "stack-protector-buffer-size"="8" "target-features"="+pacbti" } + +module; + +export module foo; + +export void func();