@@ -2438,7 +2438,10 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
2438
2438
2439
2439
// Some ABIs may result in additional accesses to arguments that may
2440
2440
// otherwise not be present.
2441
+ std::optional<llvm::Attribute::AttrKind> MemAttrForPtrArgs;
2442
+ bool AddedPotentialArgAccess = false ;
2441
2443
auto AddPotentialArgAccess = [&]() {
2444
+ AddedPotentialArgAccess = true ;
2442
2445
llvm::Attribute A = FuncAttrs.getAttribute (llvm::Attribute::Memory);
2443
2446
if (A.isValid ())
2444
2447
FuncAttrs.addMemoryAttr (A.getMemoryEffects () |
@@ -2499,11 +2502,13 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
2499
2502
// gcc specifies that 'const' functions have greater restrictions than
2500
2503
// 'pure' functions, so they also cannot have infinite loops.
2501
2504
FuncAttrs.addAttribute (llvm::Attribute::WillReturn);
2505
+ MemAttrForPtrArgs = llvm::Attribute::ReadNone;
2502
2506
} else if (TargetDecl->hasAttr <PureAttr>()) {
2503
2507
FuncAttrs.addMemoryAttr (llvm::MemoryEffects::readOnly ());
2504
2508
FuncAttrs.addAttribute (llvm::Attribute::NoUnwind);
2505
2509
// gcc specifies that 'pure' functions cannot have infinite loops.
2506
2510
FuncAttrs.addAttribute (llvm::Attribute::WillReturn);
2511
+ MemAttrForPtrArgs = llvm::Attribute::ReadOnly;
2507
2512
} else if (TargetDecl->hasAttr <NoAliasAttr>()) {
2508
2513
FuncAttrs.addMemoryAttr (llvm::MemoryEffects::inaccessibleOrArgMemOnly ());
2509
2514
FuncAttrs.addAttribute (llvm::Attribute::NoUnwind);
@@ -3011,6 +3016,27 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
3011
3016
}
3012
3017
assert (ArgNo == FI.arg_size ());
3013
3018
3019
+ ArgNo = 0 ;
3020
+ if (AddedPotentialArgAccess && MemAttrForPtrArgs) {
3021
+ llvm::FunctionType *FunctionType = FunctionType =
3022
+ getTypes ().GetFunctionType (FI);
3023
+ for (CGFunctionInfo::const_arg_iterator I = FI.arg_begin (),
3024
+ E = FI.arg_end ();
3025
+ I != E; ++I, ++ArgNo) {
3026
+ if (I->info .isDirect () || I->info .isExpand () ||
3027
+ I->info .isCoerceAndExpand ()) {
3028
+ unsigned FirstIRArg, NumIRArgs;
3029
+ std::tie (FirstIRArg, NumIRArgs) = IRFunctionArgs.getIRArgs (ArgNo);
3030
+ for (unsigned i = FirstIRArg; i < FirstIRArg + NumIRArgs; ++i) {
3031
+ if (FunctionType->getParamType (i)->isPointerTy ()) {
3032
+ ArgAttrs[i] =
3033
+ ArgAttrs[i].addAttribute (getLLVMContext (), *MemAttrForPtrArgs);
3034
+ }
3035
+ }
3036
+ }
3037
+ }
3038
+ }
3039
+
3014
3040
AttrList = llvm::AttributeList::get (
3015
3041
getLLVMContext (), llvm::AttributeSet::get (getLLVMContext (), FuncAttrs),
3016
3042
llvm::AttributeSet::get (getLLVMContext (), RetAttrs), ArgAttrs);
0 commit comments