[llvm-commits] [llvm] r45891 - /llvm/trunk/lib/Target/CBackend/CBackend.cpp
Evan Cheng
evan.cheng at apple.com
Fri Jan 11 15:10:12 PST 2008
Author: evancheng
Date: Fri Jan 11 17:10:11 2008
New Revision: 45891
URL: http://llvm.org/viewvc/llvm-project?rev=45891&view=rev
Log:
More cbe byval fixes.
Modified:
llvm/trunk/lib/Target/CBackend/CBackend.cpp
Modified: llvm/trunk/lib/Target/CBackend/CBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CBackend/CBackend.cpp?rev=45891&r1=45890&r2=45891&view=diff
==============================================================================
--- llvm/trunk/lib/Target/CBackend/CBackend.cpp (original)
+++ llvm/trunk/lib/Target/CBackend/CBackend.cpp Fri Jan 11 17:10:11 2008
@@ -1908,18 +1908,24 @@
} 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;
@@ -2628,9 +2634,11 @@
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*/ ";
@@ -2685,22 +2693,26 @@
}
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 << ')';
More information about the llvm-commits
mailing list