@@ -1016,8 +1016,8 @@ static void forConstantArrayExpansion(CodeGenFunction &CGF,
1016
1016
}
1017
1017
}
1018
1018
1019
- void CodeGenFunction::ExpandTypeFromArgs (
1020
- QualType Ty, LValue LV, SmallVectorImpl< llvm::Value *>::iterator &AI) {
1019
+ void CodeGenFunction::ExpandTypeFromArgs (QualType Ty, LValue LV,
1020
+ llvm::Function::arg_iterator &AI) {
1021
1021
assert (LV.isSimple () &&
1022
1022
" Unexpected non-simple lvalue during struct expansion." );
1023
1023
@@ -1046,17 +1046,17 @@ void CodeGenFunction::ExpandTypeFromArgs(
1046
1046
ExpandTypeFromArgs (FD->getType (), SubLV, AI);
1047
1047
}
1048
1048
} else if (isa<ComplexExpansion>(Exp.get ())) {
1049
- auto realValue = *AI++;
1050
- auto imagValue = *AI++;
1049
+ auto realValue = & *AI++;
1050
+ auto imagValue = & *AI++;
1051
1051
EmitStoreOfComplex (ComplexPairTy (realValue, imagValue), LV, /* init*/ true );
1052
1052
} else {
1053
1053
// Call EmitStoreOfScalar except when the lvalue is a bitfield to emit a
1054
1054
// primitive store.
1055
1055
assert (isa<NoExpansion>(Exp.get ()));
1056
1056
if (LV.isBitField ())
1057
- EmitStoreThroughLValue (RValue::get (*AI++), LV);
1057
+ EmitStoreThroughLValue (RValue::get (& *AI++), LV);
1058
1058
else
1059
- EmitStoreOfScalar (*AI++, LV);
1059
+ EmitStoreOfScalar (& *AI++, LV);
1060
1060
}
1061
1061
}
1062
1062
@@ -2323,27 +2323,21 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2323
2323
// simplify.
2324
2324
2325
2325
ClangToLLVMArgMapping IRFunctionArgs (CGM.getContext (), FI);
2326
- // Flattened function arguments.
2327
- SmallVector<llvm::Value *, 16 > FnArgs;
2328
- FnArgs.reserve (IRFunctionArgs.totalIRArgs ());
2329
- for (auto &Arg : Fn->args ()) {
2330
- FnArgs.push_back (&Arg);
2331
- }
2332
- assert (FnArgs.size () == IRFunctionArgs.totalIRArgs ());
2326
+ assert (Fn->arg_size () == IRFunctionArgs.totalIRArgs ());
2333
2327
2334
2328
// If we're using inalloca, all the memory arguments are GEPs off of the last
2335
2329
// parameter, which is a pointer to the complete memory area.
2336
2330
Address ArgStruct = Address::invalid ();
2337
2331
if (IRFunctionArgs.hasInallocaArg ()) {
2338
- ArgStruct = Address (FnArgs[ IRFunctionArgs.getInallocaArgNo ()] ,
2332
+ ArgStruct = Address (Fn-> getArg ( IRFunctionArgs.getInallocaArgNo ()) ,
2339
2333
FI.getArgStructAlignment ());
2340
2334
2341
2335
assert (ArgStruct.getType () == FI.getArgStruct ()->getPointerTo ());
2342
2336
}
2343
2337
2344
2338
// Name the struct return parameter.
2345
2339
if (IRFunctionArgs.hasSRetArg ()) {
2346
- auto AI = cast<llvm::Argument>(FnArgs[ IRFunctionArgs.getSRetArgNo ()] );
2340
+ auto AI = Fn-> getArg ( IRFunctionArgs.getSRetArgNo ());
2347
2341
AI->setName (" agg.result" );
2348
2342
AI->addAttr (llvm::Attribute::NoAlias);
2349
2343
}
@@ -2394,7 +2388,8 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2394
2388
2395
2389
case ABIArgInfo::Indirect: {
2396
2390
assert (NumIRArgs == 1 );
2397
- Address ParamAddr = Address (FnArgs[FirstIRArg], ArgI.getIndirectAlign ());
2391
+ Address ParamAddr =
2392
+ Address (Fn->getArg (FirstIRArg), ArgI.getIndirectAlign ());
2398
2393
2399
2394
if (!hasScalarEvaluationKind (Ty)) {
2400
2395
// Aggregates and complex variables are accessed by reference. All we
@@ -2436,8 +2431,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2436
2431
ArgI.getCoerceToType () == ConvertType (Ty) &&
2437
2432
ArgI.getDirectOffset () == 0 ) {
2438
2433
assert (NumIRArgs == 1 );
2439
- llvm::Value *V = FnArgs[FirstIRArg];
2440
- auto AI = cast<llvm::Argument>(V);
2434
+ auto AI = Fn->getArg (FirstIRArg);
2441
2435
2442
2436
if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg)) {
2443
2437
if (getNonNullAttr (CurCodeDecl, PVD, PVD->getType (),
@@ -2499,6 +2493,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2499
2493
2500
2494
// LLVM expects swifterror parameters to be used in very restricted
2501
2495
// ways. Copy the value into a less-restricted temporary.
2496
+ llvm::Value *V = AI;
2502
2497
if (FI.getExtParameterInfo (ArgNo).getABI ()
2503
2498
== ParameterABI::SwiftErrorResult) {
2504
2499
QualType pointeeTy = Ty->getPointeeType ();
@@ -2560,7 +2555,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2560
2555
2561
2556
assert (STy->getNumElements () == NumIRArgs);
2562
2557
for (unsigned i = 0 , e = STy->getNumElements (); i != e; ++i) {
2563
- auto AI = FnArgs[ FirstIRArg + i] ;
2558
+ auto AI = Fn-> getArg ( FirstIRArg + i) ;
2564
2559
AI->setName (Arg->getName () + " .coerce" + Twine (i));
2565
2560
Address EltPtr = Builder.CreateStructGEP (AddrToStoreInto, i);
2566
2561
Builder.CreateStore (AI, EltPtr);
@@ -2573,7 +2568,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2573
2568
} else {
2574
2569
// Simple case, just do a coerced store of the argument into the alloca.
2575
2570
assert (NumIRArgs == 1 );
2576
- auto AI = FnArgs[ FirstIRArg] ;
2571
+ auto AI = Fn-> getArg ( FirstIRArg) ;
2577
2572
AI->setName (Arg->getName () + " .coerce" );
2578
2573
CreateCoercedStore (AI, Ptr, /* DstIsVolatile=*/ false , *this );
2579
2574
}
@@ -2606,7 +2601,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2606
2601
continue ;
2607
2602
2608
2603
auto eltAddr = Builder.CreateStructGEP (alloca, i);
2609
- auto elt = FnArgs[ argIndex++] ;
2604
+ auto elt = Fn-> getArg ( argIndex++) ;
2610
2605
Builder.CreateStore (elt, eltAddr);
2611
2606
}
2612
2607
assert (argIndex == FirstIRArg + NumIRArgs);
@@ -2621,11 +2616,11 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
2621
2616
LValue LV = MakeAddrLValue (Alloca, Ty);
2622
2617
ArgVals.push_back (ParamValue::forIndirect (Alloca));
2623
2618
2624
- auto FnArgIter = FnArgs. begin () + FirstIRArg;
2619
+ auto FnArgIter = Fn-> arg_begin () + FirstIRArg;
2625
2620
ExpandTypeFromArgs (Ty, LV, FnArgIter);
2626
- assert (FnArgIter == FnArgs. begin () + FirstIRArg + NumIRArgs);
2621
+ assert (FnArgIter == Fn-> arg_begin () + FirstIRArg + NumIRArgs);
2627
2622
for (unsigned i = 0 , e = NumIRArgs; i != e; ++i) {
2628
- auto AI = FnArgs[ FirstIRArg + i] ;
2623
+ auto AI = Fn-> getArg ( FirstIRArg + i) ;
2629
2624
AI->setName (Arg->getName () + " ." + Twine (i));
2630
2625
}
2631
2626
break ;
0 commit comments