} else {
// Loop over the arguments, printing them.
FunctionType::param_iterator I = FT->param_begin(), E = FT->param_end();
+ unsigned Idx = 1;
// If this is a struct-return function, don't print the hidden
// struct-return argument.
if (isStructReturn) {
assert(I != E && "Invalid struct return function!");
++I;
+ ++Idx;
}
- unsigned Idx = 1;
for (; I != E; ++I) {
if (PrintedArg) FunctionInnards << ", ";
- printType(FunctionInnards, *I,
+ const Type *ArgTy = *I;
+ if (PAL && PAL->paramHasAttr(Idx, ParamAttr::ByVal)) {
+ assert(isa<PointerType>(ArgTy));
+ ArgTy = cast<PointerType>(ArgTy)->getElementType();
+ }
+ printType(FunctionInnards, ArgTy,
/*isSigned=*/PAL && PAL->paramHasAttr(Idx, ParamAttr::SExt));
PrintedArg = true;
++Idx;
const ParamAttrsList *PAL = I.getParamAttrs();
bool isStructRet = I.isStructReturn();
if (isStructRet) {
- Out << "*(";
+ bool isByVal = ByValParams.count(I.getOperand(1));
+ if (!isByVal) Out << "*(";
writeOperand(I.getOperand(1));
- Out << ") = ";
+ if (!isByVal) Out << ")";
+ Out << " = ";
}
if (I.isTailCall()) Out << " /*tail*/ ";
}
bool PrintedArg = false;
- unsigned Idx = 1;
- for (; AI != AE; ++AI, ++ArgNo, ++Idx) {
+ for (; AI != AE; ++AI, ++ArgNo) {
if (PrintedArg) Out << ", ";
if (ArgNo < NumDeclaredParams &&
(*AI)->getType() != FTy->getParamType(ArgNo)) {
Out << '(';
printType(Out, FTy->getParamType(ArgNo),
- /*isSigned=*/PAL && PAL->paramHasAttr(Idx, ParamAttr::SExt));
+ /*isSigned=*/PAL && PAL->paramHasAttr(ArgNo+1, ParamAttr::SExt));
Out << ')';
}
- // If call is expecting argument to be passed by value, then do not
- // take its address.
- if (PAL && PAL->paramHasAttr(Idx, ParamAttr::ByVal))
- writeOperandInternal(*AI);
- else
- writeOperand(*AI);
+ // Check if the argument is expected to be passed by value.
+ bool isOutByVal = PAL && PAL->paramHasAttr(ArgNo+1, ParamAttr::ByVal);
+ // Check if this argument itself is passed in by reference.
+ bool isInByVal = ByValParams.count(*AI);
+ if (isOutByVal && !isInByVal)
+ Out << "*(";
+ else if (!isOutByVal && isInByVal)
+ Out << "&(";
+ writeOperand(*AI);
+ if (isOutByVal ^ isInByVal)
+ Out << ")";
PrintedArg = true;
}
Out << ')';