implement vaarg. Varargs now should work.
authorChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 06:37:38 +0000 (06:37 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 06:37:38 +0000 (06:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24986 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcISelDAGToDAG.cpp
lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp

index e88ad2d2058151e2b4f51dfd00bd1c5abc8fe128..c8615fc6935b5be615b90a3df844dc3169799863 100644 (file)
@@ -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::
index e88ad2d2058151e2b4f51dfd00bd1c5abc8fe128..c8615fc6935b5be615b90a3df844dc3169799863 100644 (file)
@@ -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::