31
31
#include " llvm/ADT/StringRef.h"
32
32
#include " llvm/ADT/StringSet.h"
33
33
#include " llvm/Frontend/OpenMP/OMPGridValues.h"
34
+ #include " llvm/IR/Attributes.h"
34
35
#include " llvm/IR/DerivedTypes.h"
36
+ #include " llvm/IR/Function.h"
35
37
#include " llvm/Support/DataTypes.h"
36
38
#include " llvm/Support/Error.h"
37
39
#include " llvm/Support/VersionTuple.h"
@@ -1368,15 +1370,14 @@ class TargetInfo : public TransferrableTargetInfo,
1368
1370
return StringRef ();
1369
1371
}
1370
1372
1371
- struct BranchProtectionInfo {
1373
+ class BranchProtectionInfo {
1374
+ public:
1372
1375
LangOptions::SignReturnAddressScopeKind SignReturnAddr;
1373
1376
LangOptions::SignReturnAddressKeyKind SignKey;
1374
1377
bool BranchTargetEnforcement;
1375
1378
bool BranchProtectionPAuthLR;
1376
1379
bool GuardedControlStack;
1377
1380
1378
- BranchProtectionInfo () = default ;
1379
-
1380
1381
const char *getSignReturnAddrStr () const {
1381
1382
switch (SignReturnAddr) {
1382
1383
case LangOptions::SignReturnAddressScopeKind::None:
@@ -1388,7 +1389,6 @@ class TargetInfo : public TransferrableTargetInfo,
1388
1389
}
1389
1390
llvm_unreachable (" Unexpected SignReturnAddressScopeKind" );
1390
1391
}
1391
-
1392
1392
const char *getSignKeyStr () const {
1393
1393
switch (SignKey) {
1394
1394
case LangOptions::SignReturnAddressKeyKind::AKey:
@@ -1398,6 +1398,41 @@ class TargetInfo : public TransferrableTargetInfo,
1398
1398
}
1399
1399
llvm_unreachable (" Unexpected SignReturnAddressKeyKind" );
1400
1400
}
1401
+
1402
+ BranchProtectionInfo () = default ;
1403
+ BranchProtectionInfo (const LangOptions &LangOpts) {
1404
+ SignReturnAddr =
1405
+ LangOpts.hasSignReturnAddress ()
1406
+ ? (LangOpts.isSignReturnAddressScopeAll ()
1407
+ ? LangOptions::SignReturnAddressScopeKind::All
1408
+ : LangOptions::SignReturnAddressScopeKind::NonLeaf)
1409
+ : LangOptions::SignReturnAddressScopeKind::None;
1410
+ SignKey = LangOpts.isSignReturnAddressWithAKey ()
1411
+ ? LangOptions::SignReturnAddressKeyKind::AKey
1412
+ : LangOptions::SignReturnAddressKeyKind::BKey;
1413
+ BranchTargetEnforcement = LangOpts.BranchTargetEnforcement ;
1414
+ BranchProtectionPAuthLR = LangOpts.BranchProtectionPAuthLR ;
1415
+ GuardedControlStack = LangOpts.GuardedControlStack ;
1416
+ }
1417
+
1418
+ void setFnAttributes (llvm::Function &F) {
1419
+ llvm::AttrBuilder FuncAttrs (F.getContext ());
1420
+ setFnAttributes (FuncAttrs);
1421
+ F.addFnAttrs (FuncAttrs);
1422
+ }
1423
+
1424
+ void setFnAttributes (llvm::AttrBuilder &FuncAttrs) {
1425
+ if (SignReturnAddr != LangOptions::SignReturnAddressScopeKind::None) {
1426
+ FuncAttrs.addAttribute (" sign-return-address" , getSignReturnAddrStr ());
1427
+ FuncAttrs.addAttribute (" sign-return-address-key" , getSignKeyStr ());
1428
+ }
1429
+ if (BranchTargetEnforcement)
1430
+ FuncAttrs.addAttribute (" branch-target-enforcement" , " true" );
1431
+ if (BranchProtectionPAuthLR)
1432
+ FuncAttrs.addAttribute (" branch-protection-pauth-lr" , " true" );
1433
+ if (GuardedControlStack)
1434
+ FuncAttrs.addAttribute (" guarded-control-stack" , " true" );
1435
+ }
1401
1436
};
1402
1437
1403
1438
// / Determine if the Architecture in this TargetInfo supports branch
0 commit comments