diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2007-08-20 15:18:24 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2007-08-20 15:18:24 +0000 |
commit | 9c3d20d82372a5392c2fe344f75ac5c29f3c9393 (patch) | |
tree | b41215c65ce80fab45af151e9f01149d413e5cf4 /llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | |
parent | 78846b69ae617fbb242643de021f8b4c7f314afc (diff) | |
download | bcm5719-llvm-9c3d20d82372a5392c2fe344f75ac5c29f3c9393.tar.gz bcm5719-llvm-9c3d20d82372a5392c2fe344f75ac5c29f3c9393.zip |
Partial implementation of calling functions with byval arguments:
*) The needed information is propagated to the DAG
*) The X86-64 backend detects it and aborts
llvm-svn: 41179
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index a99640a1704..78539d454ed 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2905,6 +2905,7 @@ void SelectionDAGLowering::LowerCallTo(Instruction &I, Entry.isInReg = Attrs && Attrs->paramHasAttr(attrInd, ParamAttr::InReg); Entry.isSRet = Attrs && Attrs->paramHasAttr(attrInd, ParamAttr::StructRet); Entry.isNest = Attrs && Attrs->paramHasAttr(attrInd, ParamAttr::Nest); + Entry.isByVal = Attrs && Attrs->paramHasAttr(attrInd, ParamAttr::ByVal); Args.push_back(Entry); } @@ -3967,6 +3968,15 @@ TargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy, Flags |= ISD::ParamFlags::InReg; if (Args[i].isSRet) Flags |= ISD::ParamFlags::StructReturn; + if (Args[i].isByVal) { + Flags |= ISD::ParamFlags::ByVal; + const PointerType *Ty = cast<PointerType>(Args[i].Ty); + const StructType *STy = cast<StructType>(Ty->getElementType()); + unsigned StructAlign = Log2_32(getTargetData()->getABITypeAlignment(STy)); + unsigned StructSize = getTargetData()->getTypeSize(STy); + Flags |= (StructAlign << ISD::ParamFlags::ByValAlignOffs); + Flags |= (StructSize << ISD::ParamFlags::ByValSizeOffs); + } if (Args[i].isNest) Flags |= ISD::ParamFlags::Nest; Flags |= OriginalAlignment << ISD::ParamFlags::OrigAlignmentOffs; |