Skip to content

Commit 4b2daec

Browse files
Revert "[Clang][ARM][AArch64] Alway emit protection attributes for functions." (#98284)
Reverts #82819
1 parent ac28559 commit 4b2daec

File tree

60 files changed

+316
-292
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+316
-292
lines changed

clang/include/clang/Basic/TargetInfo.h

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@
3232
#include "llvm/ADT/StringRef.h"
3333
#include "llvm/ADT/StringSet.h"
3434
#include "llvm/Frontend/OpenMP/OMPGridValues.h"
35-
#include "llvm/IR/Attributes.h"
3635
#include "llvm/IR/DerivedTypes.h"
37-
#include "llvm/IR/Function.h"
3836
#include "llvm/Support/DataTypes.h"
3937
#include "llvm/Support/Error.h"
4038
#include "llvm/Support/VersionTuple.h"
@@ -1402,15 +1400,15 @@ class TargetInfo : public TransferrableTargetInfo,
14021400
return true;
14031401
}
14041402

1405-
class BranchProtectionInfo {
1406-
public:
1403+
struct BranchProtectionInfo {
14071404
LangOptions::SignReturnAddressScopeKind SignReturnAddr;
14081405
LangOptions::SignReturnAddressKeyKind SignKey;
14091406
bool BranchTargetEnforcement;
14101407
bool BranchProtectionPAuthLR;
14111408
bool GuardedControlStack;
14121409

1413-
protected:
1410+
BranchProtectionInfo() = default;
1411+
14141412
const char *getSignReturnAddrStr() const {
14151413
switch (SignReturnAddr) {
14161414
case LangOptions::SignReturnAddressScopeKind::None:
@@ -1432,42 +1430,6 @@ class TargetInfo : public TransferrableTargetInfo,
14321430
}
14331431
llvm_unreachable("Unexpected SignReturnAddressKeyKind");
14341432
}
1435-
1436-
public:
1437-
BranchProtectionInfo() = default;
1438-
BranchProtectionInfo(const LangOptions &LangOpts) {
1439-
SignReturnAddr =
1440-
LangOpts.hasSignReturnAddress()
1441-
? (LangOpts.isSignReturnAddressScopeAll()
1442-
? LangOptions::SignReturnAddressScopeKind::All
1443-
: LangOptions::SignReturnAddressScopeKind::NonLeaf)
1444-
: LangOptions::SignReturnAddressScopeKind::None;
1445-
SignKey = LangOpts.isSignReturnAddressWithAKey()
1446-
? LangOptions::SignReturnAddressKeyKind::AKey
1447-
: LangOptions::SignReturnAddressKeyKind::BKey;
1448-
BranchTargetEnforcement = LangOpts.BranchTargetEnforcement;
1449-
BranchProtectionPAuthLR = LangOpts.BranchProtectionPAuthLR;
1450-
GuardedControlStack = LangOpts.GuardedControlStack;
1451-
}
1452-
1453-
void setFnAttributes(llvm::Function &F) {
1454-
llvm::AttrBuilder FuncAttrs(F.getContext());
1455-
setFnAttributes(FuncAttrs);
1456-
F.addFnAttrs(FuncAttrs);
1457-
}
1458-
1459-
void setFnAttributes(llvm::AttrBuilder &FuncAttrs) {
1460-
if (SignReturnAddr != LangOptions::SignReturnAddressScopeKind::None) {
1461-
FuncAttrs.addAttribute("sign-return-address", getSignReturnAddrStr());
1462-
FuncAttrs.addAttribute("sign-return-address-key", getSignKeyStr());
1463-
}
1464-
if (BranchTargetEnforcement)
1465-
FuncAttrs.addAttribute("branch-target-enforcement");
1466-
if (BranchProtectionPAuthLR)
1467-
FuncAttrs.addAttribute("branch-protection-pauth-lr");
1468-
if (GuardedControlStack)
1469-
FuncAttrs.addAttribute("guarded-control-stack");
1470-
}
14711433
};
14721434

14731435
/// Determine if the Architecture in this TargetInfo supports branch

clang/lib/CodeGen/Targets/AArch64.cpp

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,20 +120,37 @@ class AArch64TargetCodeGenInfo : public TargetCodeGenInfo {
120120
if (!FD)
121121
return;
122122

123-
TargetInfo::BranchProtectionInfo BPI(CGM.getLangOpts());
124-
125-
if (const auto *TA = FD->getAttr<TargetAttr>()) {
126-
ParsedTargetAttr Attr =
127-
CGM.getTarget().parseTargetAttr(TA->getFeaturesStr());
128-
if (!Attr.BranchProtection.empty()) {
129-
StringRef Error;
130-
(void)CGM.getTarget().validateBranchProtection(Attr.BranchProtection,
131-
Attr.CPU, BPI, Error);
132-
assert(Error.empty());
133-
}
134-
}
123+
const auto *TA = FD->getAttr<TargetAttr>();
124+
if (TA == nullptr)
125+
return;
126+
127+
ParsedTargetAttr Attr =
128+
CGM.getTarget().parseTargetAttr(TA->getFeaturesStr());
129+
if (Attr.BranchProtection.empty())
130+
return;
131+
132+
TargetInfo::BranchProtectionInfo BPI;
133+
StringRef Error;
134+
(void)CGM.getTarget().validateBranchProtection(Attr.BranchProtection,
135+
Attr.CPU, BPI, Error);
136+
assert(Error.empty());
137+
135138
auto *Fn = cast<llvm::Function>(GV);
136-
BPI.setFnAttributes(*Fn);
139+
Fn->addFnAttr("sign-return-address", BPI.getSignReturnAddrStr());
140+
141+
if (BPI.SignReturnAddr != LangOptions::SignReturnAddressScopeKind::None) {
142+
Fn->addFnAttr("sign-return-address-key",
143+
BPI.SignKey == LangOptions::SignReturnAddressKeyKind::AKey
144+
? "a_key"
145+
: "b_key");
146+
}
147+
148+
Fn->addFnAttr("branch-target-enforcement",
149+
BPI.BranchTargetEnforcement ? "true" : "false");
150+
Fn->addFnAttr("branch-protection-pauth-lr",
151+
BPI.BranchProtectionPAuthLR ? "true" : "false");
152+
Fn->addFnAttr("guarded-control-stack",
153+
BPI.GuardedControlStack ? "true" : "false");
137154
}
138155

139156
bool isScalarizableAsmOperand(CodeGen::CodeGenFunction &CGF,

clang/lib/CodeGen/Targets/ARM.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
152152
diag::warn_target_unsupported_branch_protection_attribute)
153153
<< Arch;
154154
} else {
155-
BPI.setFnAttributes(*Fn);
155+
Fn->addFnAttr("sign-return-address", BPI.getSignReturnAddrStr());
156+
Fn->addFnAttr("branch-target-enforcement",
157+
BPI.BranchTargetEnforcement ? "true" : "false");
156158
}
157159
} else if (CGM.getLangOpts().BranchTargetEnforcement ||
158160
CGM.getLangOpts().hasSignReturnAddress()) {
@@ -165,10 +167,6 @@ class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
165167
diag::warn_target_unsupported_branch_protection_attribute)
166168
<< Attr.CPU;
167169
}
168-
} else if (CGM.getTarget().isBranchProtectionSupportedArch(
169-
CGM.getTarget().getTargetOpts().CPU)) {
170-
TargetInfo::BranchProtectionInfo BPI(CGM.getLangOpts());
171-
BPI.setFnAttributes(*Fn);
172170
}
173171

174172
const ARMInterruptAttr *Attr = FD->getAttr<ARMInterruptAttr>();

clang/test/CodeGen/aarch64-branch-protection-attr.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,29 +67,29 @@ __attribute__ ((target("branch-protection=gcs")))
6767
void gcs() {}
6868
// CHECK: define{{.*}} void @gcs() #[[#GCS:]]
6969

70-
// CHECK-DAG: attributes #[[#NONE]] = { {{.*}}
70+
// CHECK-DAG: attributes #[[#NONE]] = { {{.*}} "branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}} "sign-return-address"="none"
7171

72-
// CHECK-DAG: attributes #[[#STD]] = { {{.*}} "branch-target-enforcement" "guarded-control-stack" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
72+
// CHECK-DAG: attributes #[[#STD]] = { {{.*}} "branch-target-enforcement"="true" "guarded-control-stack"="true" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
7373

74-
// CHECK-DAG: attributes #[[#BTI]] = { {{.*}} "branch-target-enforcement"
74+
// CHECK-DAG: attributes #[[#BTI]] = { {{.*}} "branch-target-enforcement"="true" "guarded-control-stack"="false" {{.*}} "sign-return-address"="none"
7575

76-
// CHECK-DAG: attributes #[[#PAC]] = { {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
76+
// CHECK-DAG: attributes #[[#PAC]] = { {{.*}} "branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
7777

78-
// CHECK-DAG: attributes #[[#PACLEAF]] = { {{.*}} "sign-return-address"="all" "sign-return-address-key"="a_key"
78+
// CHECK-DAG: attributes #[[#PACLEAF]] = { {{.*}} "branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}}"sign-return-address"="all" "sign-return-address-key"="a_key"
7979

80-
// CHECK-DAG: attributes #[[#PACBKEY]] = { {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
80+
// CHECK-DAG: attributes #[[#PACBKEY]] = { {{.*}}"branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
8181

82-
// CHECK-DAG: attributes #[[#PACBKEYLEAF]] = { {{.*}} "sign-return-address"="all" "sign-return-address-key"="b_key"
82+
// CHECK-DAG: attributes #[[#PACBKEYLEAF]] = { {{.*}} "branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}}"sign-return-address"="all" "sign-return-address-key"="b_key"
8383

84-
// CHECK-DAG: attributes #[[#BTIPACLEAF]] = { {{.*}} "branch-target-enforcement" {{.*}}"sign-return-address"="all" "sign-return-address-key"="a_key"
84+
// CHECK-DAG: attributes #[[#BTIPACLEAF]] = { {{.*}}"branch-target-enforcement"="true" "guarded-control-stack"="false" {{.*}} "sign-return-address"="all" "sign-return-address-key"="a_key"
8585

8686

87-
// CHECK-DAG: attributes #[[#PAUTHLR]] = { {{.*}} "branch-protection-pauth-lr" {{.*}}"sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
87+
// CHECK-DAG: attributes #[[#PAUTHLR]] = { {{.*}}"branch-protection-pauth-lr"="true" {{.*}}"branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}}"sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
8888

89-
// CHECK-DAG: attributes #[[#PAUTHLR_BKEY]] = { {{.*}} "branch-protection-pauth-lr" {{.*}}"sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
89+
// CHECK-DAG: attributes #[[#PAUTHLR_BKEY]] = { {{.*}}"branch-protection-pauth-lr"="true" {{.*}}"branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}}"sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
9090

91-
// CHECK-DAG: attributes #[[#PAUTHLR_LEAF]] = { {{.*}} "branch-protection-pauth-lr" {{.*}}"sign-return-address"="all" "sign-return-address-key"="a_key"
91+
// CHECK-DAG: attributes #[[#PAUTHLR_LEAF]] = { {{.*}}"branch-protection-pauth-lr"="true" {{.*}}"branch-target-enforcement"="false" "guarded-control-stack"="false" {{.*}}"sign-return-address"="all" "sign-return-address-key"="a_key"
9292

93-
// CHECK-DAG: attributes #[[#PAUTHLR_BTI]] = { {{.*}} "branch-protection-pauth-lr" {{.*}}"branch-target-enforcement" {{.*}}"sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
93+
// CHECK-DAG: attributes #[[#PAUTHLR_BTI]] = { {{.*}}"branch-protection-pauth-lr"="true" {{.*}}"branch-target-enforcement"="true" "guarded-control-stack"="false" {{.*}}"sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
9494

95-
// CHECK-DAG: attributes #[[#GCS]] = { {{.*}} "guarded-control-stack"
95+
// CHECK-DAG: attributes #[[#GCS]] = { {{.*}}"branch-target-enforcement"="false" "guarded-control-stack"="true" {{.*}} "sign-return-address"="none"

clang/test/CodeGen/aarch64-sign-return-address.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,9 @@
1313

1414
// CHECK-LABEL: @foo() #[[#ATTR:]]
1515

16-
// NONE-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"
17-
// NONE-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"
18-
// NONE-NOT: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
19-
20-
// ALL: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"
21-
// PART: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"="a_key"
22-
// B-KEY: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"="b_key"
23-
// BTE: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
24-
16+
// CHECK-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"
17+
// CHECK-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"
18+
// CHECK-NOT: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
2519

2620
// Check module attributes
2721

clang/test/CodeGen/arm-branch-protection-attr-1.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ __attribute__((target("branch-protection=pac-ret+leaf"))) void leaf() {}
2929
__attribute__((target("branch-protection=pac-ret+leaf+bti"))) void btileaf() {}
3030
// CHECK: define{{.*}} void @btileaf() #[[#BTIPACLEAF:]]
3131

32-
// CHECK-DAG: attributes #[[#NONE]] = { {{.*}}
32+
// CHECK-DAG: attributes #[[#NONE]] = { {{.*}} "branch-target-enforcement"="false" {{.*}} "sign-return-address"="none"
3333

34-
// CHECK-DAG: attributes #[[#STD]] = { {{.*}} "branch-target-enforcement" {{.*}} "sign-return-address"="non-leaf"
34+
// CHECK-DAG: attributes #[[#STD]] = { {{.*}} "branch-target-enforcement"="true" {{.*}} "sign-return-address"="non-leaf"
3535

36-
// CHECK-DAG: attributes #[[#BTI]] = { {{.*}} "branch-target-enforcement"
36+
// CHECK-DAG: attributes #[[#BTI]] = { {{.*}} "branch-target-enforcement"="true" {{.*}} "sign-return-address"="none"
3737

38-
// CHECK-DAG: attributes #[[#PAC]] = { {{.*}} "sign-return-address"="non-leaf"
38+
// CHECK-DAG: attributes #[[#PAC]] = { {{.*}} "branch-target-enforcement"="false" {{.*}} "sign-return-address"="non-leaf"
3939

40-
// CHECK-DAG: attributes #[[#PACLEAF]] = { {{.*}} "sign-return-address"="all"
40+
// CHECK-DAG: attributes #[[#PACLEAF]] = { {{.*}} "branch-target-enforcement"="false" {{.*}}"sign-return-address"="all"
4141

42-
// CHECK-DAG: attributes #[[#BTIPACLEAF]] = { {{.*}} "branch-target-enforcement" {{.*}} "sign-return-address"="all"
42+
// CHECK-DAG: attributes #[[#BTIPACLEAF]] = { {{.*}}"branch-target-enforcement"="true" {{.*}} "sign-return-address"="all"

clang/test/CodeGen/arm-branch-protection-attr-2.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,13 @@
55
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main -S -emit-llvm -o - -mbranch-protection=pac-ret+b-key %s | FileCheck %s --check-prefix=CHECK --check-prefix=PART
66
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main -S -emit-llvm -o - -mbranch-protection=bti %s | FileCheck %s --check-prefix=CHECK --check-prefix=BTE
77

8-
// Check there are branch protection function attributes
8+
// Check there are no branch protection function attributes
99

1010
// CHECK-LABEL: @foo() #[[#ATTR:]]
1111

12-
// NONE-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"
13-
// NONE-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"
14-
// NONE-NOT: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
15-
16-
// ALL: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"="all"
17-
// PART: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"="non-leaf"
18-
// BTE: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
19-
12+
// CHECK-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"
13+
// CHECK-NOT: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"
14+
// CHECK-NOT: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
2015

2116
// Check module attributes
2217

clang/test/Frontend/arm-branch-protection-lto.c

Lines changed: 0 additions & 24 deletions
This file was deleted.

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12012,7 +12012,17 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond,
1201212012
// table branch.
1201312013
if (FallthroughUnreachable) {
1201412014
Function &CurFunc = CurMF->getFunction();
12015-
if (!CurFunc.hasFnAttribute("branch-target-enforcement"))
12015+
bool HasBranchTargetEnforcement = false;
12016+
if (CurFunc.hasFnAttribute("branch-target-enforcement")) {
12017+
HasBranchTargetEnforcement =
12018+
CurFunc.getFnAttribute("branch-target-enforcement")
12019+
.getValueAsBool();
12020+
} else {
12021+
HasBranchTargetEnforcement =
12022+
CurMF->getMMI().getModule()->getModuleFlag(
12023+
"branch-target-enforcement");
12024+
}
12025+
if (!HasBranchTargetEnforcement)
1201612026
JTH->FallthroughUnreachable = true;
1201712027
}
1201812028

llvm/lib/IR/Verifier.cpp

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,33 +2348,15 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
23482348
if (S != "a_key" && S != "b_key")
23492349
CheckFailed("invalid value for 'sign-return-address-key' attribute: " + S,
23502350
V);
2351-
if (auto AA = Attrs.getFnAttr("sign-return-address"); !AA.isValid()) {
2352-
CheckFailed(
2353-
"'sign-return-address-key' present without `sign-return-address`");
2354-
}
23552351
}
23562352

23572353
if (auto A = Attrs.getFnAttr("branch-target-enforcement"); A.isValid()) {
23582354
StringRef S = A.getValueAsString();
2359-
if (S != "" && S != "true" && S != "false")
2355+
if (S != "true" && S != "false")
23602356
CheckFailed(
23612357
"invalid value for 'branch-target-enforcement' attribute: " + S, V);
23622358
}
23632359

2364-
if (auto A = Attrs.getFnAttr("branch-protection-pauth-lr"); A.isValid()) {
2365-
StringRef S = A.getValueAsString();
2366-
if (S != "" && S != "true" && S != "false")
2367-
CheckFailed(
2368-
"invalid value for 'branch-protection-pauth-lr' attribute: " + S, V);
2369-
}
2370-
2371-
if (auto A = Attrs.getFnAttr("guarded-control-stack"); A.isValid()) {
2372-
StringRef S = A.getValueAsString();
2373-
if (S != "" && S != "true" && S != "false")
2374-
CheckFailed("invalid value for 'guarded-control-stack' attribute: " + S,
2375-
V);
2376-
}
2377-
23782360
if (auto A = Attrs.getFnAttr("vector-function-abi-variant"); A.isValid()) {
23792361
StringRef S = A.getValueAsString();
23802362
const std::optional<VFInfo> Info = VFABI::tryDemangleForVFABI(S, FT);

llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,17 +272,17 @@ void AArch64AsmPrinter::emitStartOfAsmFile(Module &M) {
272272
unsigned Flags = 0;
273273
if (const auto *BTE = mdconst::extract_or_null<ConstantInt>(
274274
M.getModuleFlag("branch-target-enforcement")))
275-
if (!BTE->isZero())
275+
if (BTE->getZExtValue())
276276
Flags |= ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
277277

278278
if (const auto *GCS = mdconst::extract_or_null<ConstantInt>(
279279
M.getModuleFlag("guarded-control-stack")))
280-
if (!GCS->isZero())
280+
if (GCS->getZExtValue())
281281
Flags |= ELF::GNU_PROPERTY_AARCH64_FEATURE_1_GCS;
282282

283283
if (const auto *Sign = mdconst::extract_or_null<ConstantInt>(
284284
M.getModuleFlag("sign-return-address")))
285-
if (!Sign->isZero())
285+
if (Sign->getZExtValue())
286286
Flags |= ELF::GNU_PROPERTY_AARCH64_FEATURE_1_PAC;
287287

288288
uint64_t PAuthABIPlatform = -1;

0 commit comments

Comments
 (0)