@@ -5185,62 +5185,39 @@ static bool isModuleAttributeSet(Module &M, const StringRef &ModAttr) {
5185
5185
return Attr && Attr->getZExtValue ();
5186
5186
}
5187
5187
5188
- // Copy an attribute from module to the function if exists.
5189
- // First value of the pair is used when the module attribute is not zero
5190
- // the second otherwise.
5191
- static void
5192
- CopyModuleAttributeToFunction (Function &F, StringRef FnAttrName,
5193
- StringRef ModAttrName,
5194
- std::pair<StringRef, StringRef> Values) {
5195
- if (F.hasFnAttribute (FnAttrName))
5196
- return ;
5197
- F.addFnAttr (FnAttrName, isModuleAttributeSet (*F.getParent (), ModAttrName)
5198
- ? Values.first
5199
- : Values.second );
5200
- }
5201
-
5202
- // Copy a boolean attribute from module to the function if exists.
5203
- // Module attribute treated false if zero otherwise true.
5204
- static void CopyModuleAttributeToFunction (Function &F, StringRef AttrName) {
5205
- CopyModuleAttributeToFunction (
5206
- F, AttrName, AttrName,
5207
- std::make_pair<StringRef, StringRef>(" true" , " false" ));
5208
- }
5209
-
5210
- // Copy an attribute from module to the function if exists.
5211
- // First value of the pair is used when the module attribute is not zero
5212
- // the second otherwise.
5213
- static void
5214
- CopyModuleAttributeToFunction (Function &F, StringRef AttrName,
5215
- std::pair<StringRef, StringRef> Values) {
5216
- CopyModuleAttributeToFunction (F, AttrName, AttrName, Values);
5217
- }
5218
-
5219
5188
void llvm::CopyModuleAttrToFunctions (Module &M) {
5220
5189
Triple T (M.getTargetTriple ());
5221
5190
if (!T.isThumb () && !T.isARM () && !T.isAArch64 ())
5222
5191
return ;
5223
5192
5193
+ StringRef SignTypeValue = " none" ;
5194
+ if (isModuleAttributeSet (M, " sign-return-address" ))
5195
+ SignTypeValue = " non-leaf" ;
5196
+ if (isModuleAttributeSet (M, " sign-return-address-all" ))
5197
+ SignTypeValue = " all" ;
5198
+
5199
+ StringRef BTEValue =
5200
+ isModuleAttributeSet (M, " branch-target-enforcement" ) ? " true" : " false" ;
5201
+ StringRef BPPLValue =
5202
+ isModuleAttributeSet (M, " branch-protection-pauth-lr" ) ? " true" : " false" ;
5203
+ StringRef GCSValue =
5204
+ isModuleAttributeSet (M, " guarded-control-stack" ) ? " true" : " false" ;
5205
+ StringRef SignKeyValue =
5206
+ isModuleAttributeSet (M, " sign-return-address-key" ) ? " b_key" : " a_key" ;
5207
+
5224
5208
for (Function &F : M.getFunctionList ()) {
5225
5209
if (F.isDeclaration ())
5226
5210
continue ;
5211
+ auto SetFunctionAttrIfNotSet = [&](StringRef FnAttrName, StringRef Value) {
5212
+ if (!F.hasFnAttribute (FnAttrName))
5213
+ F.addFnAttr (FnAttrName, Value);
5214
+ };
5227
5215
5228
- if (!F.hasFnAttribute (" sign-return-address" )) {
5229
- StringRef SignType = " none" ;
5230
- if (isModuleAttributeSet (M, " sign-return-address" ))
5231
- SignType = " non-leaf" ;
5232
-
5233
- if (isModuleAttributeSet (M, " sign-return-address-all" ))
5234
- SignType = " all" ;
5235
-
5236
- F.addFnAttr (" sign-return-address" , SignType);
5237
- }
5238
- CopyModuleAttributeToFunction (F, " branch-target-enforcement" );
5239
- CopyModuleAttributeToFunction (F, " branch-protection-pauth-lr" );
5240
- CopyModuleAttributeToFunction (F, " guarded-control-stack" );
5241
- CopyModuleAttributeToFunction (
5242
- F, " sign-return-address-key" ,
5243
- std::make_pair<StringRef, StringRef>(" b_key" , " a_key" ));
5216
+ SetFunctionAttrIfNotSet (" sign-return-address" , SignTypeValue);
5217
+ SetFunctionAttrIfNotSet (" branch-target-enforcement" , BTEValue);
5218
+ SetFunctionAttrIfNotSet (" branch-protection-pauth-lr" , BPPLValue);
5219
+ SetFunctionAttrIfNotSet (" guarded-control-stack" , GCSValue);
5220
+ SetFunctionAttrIfNotSet (" sign-return-address-key" , SignKeyValue);
5244
5221
}
5245
5222
}
5246
5223
0 commit comments