diff options
author | Chris Lattner <sabre@nondot.org> | 2005-12-23 06:37:38 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-12-23 06:37:38 +0000 |
commit | 74fa64b07205b1865bbbc77f33dfb09fdb24f142 (patch) | |
tree | 83cdd0cf77b1d045717c158f29535f4301b0acd0 | |
parent | c4769bb5290de162a62a1ed461131c5187c13356 (diff) |
implement vaarg. Varargs now should work.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24986 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/Sparc/SparcISelDAGToDAG.cpp | 15 | ||||
-rw-r--r-- | lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp | 15 |
2 files changed, 26 insertions, 4 deletions
diff --git a/lib/Target/Sparc/SparcISelDAGToDAG.cpp b/lib/Target/Sparc/SparcISelDAGToDAG.cpp index e88ad2d205..c8615fc693 100644 --- a/lib/Target/Sparc/SparcISelDAGToDAG.cpp +++ b/lib/Target/Sparc/SparcISelDAGToDAG.cpp @@ -578,8 +578,19 @@ LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, std::pair<SDOperand,SDOperand> SparcV8TargetLowering:: LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, const Type *ArgTy, SelectionDAG &DAG) { - assert(0 && "Unimp"); - abort(); + // Load the pointer out of the valist. + SDOperand Ptr = DAG.getLoad(MVT::i32, Chain, + VAListP, DAG.getSrcValue(VAListV)); + MVT::ValueType ArgVT = getValueType(ArgTy); + SDOperand Val = DAG.getLoad(ArgVT, Ptr.getValue(1), + Ptr, DAG.getSrcValue(NULL)); + // Increment the pointer. + Ptr = DAG.getNode(ISD::ADD, MVT::i32, Ptr, + DAG.getConstant(MVT::getSizeInBits(ArgVT)/8, MVT::i32)); + // Store it back to the valist. + Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain, Ptr, + VAListP, DAG.getSrcValue(VAListV)); + return std::make_pair(Val, Chain); } std::pair<SDOperand, SDOperand> SparcV8TargetLowering:: diff --git a/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp b/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp index e88ad2d205..c8615fc693 100644 --- a/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp +++ b/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp @@ -578,8 +578,19 @@ LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, std::pair<SDOperand,SDOperand> SparcV8TargetLowering:: LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, const Type *ArgTy, SelectionDAG &DAG) { - assert(0 && "Unimp"); - abort(); + // Load the pointer out of the valist. + SDOperand Ptr = DAG.getLoad(MVT::i32, Chain, + VAListP, DAG.getSrcValue(VAListV)); + MVT::ValueType ArgVT = getValueType(ArgTy); + SDOperand Val = DAG.getLoad(ArgVT, Ptr.getValue(1), + Ptr, DAG.getSrcValue(NULL)); + // Increment the pointer. + Ptr = DAG.getNode(ISD::ADD, MVT::i32, Ptr, + DAG.getConstant(MVT::getSizeInBits(ArgVT)/8, MVT::i32)); + // Store it back to the valist. + Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain, Ptr, + VAListP, DAG.getSrcValue(VAListV)); + return std::make_pair(Val, Chain); } std::pair<SDOperand, SDOperand> SparcV8TargetLowering:: |