First part of varargs support: getting all varargs which could possibly
be in registers into memory.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18006 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp
index f596669..bfb0c3e 100644
--- a/lib/Target/Sparc/SparcV8ISelSimple.cpp
+++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp
@@ -343,10 +343,30 @@
}
}
- // Copy args out of their incoming hard regs or stack slots into virtual regs.
const unsigned *IAREnd = &IncomingArgRegs[6];
const unsigned *IAR = &IncomingArgRegs[0];
unsigned ArgOffset = 68;
+
+ // Store registers onto stack if this is a varargs function.
+ // FIXME: This doesn't really pertain to "loading arguments into
+ // virtual registers", so it's not clear that it really belongs here.
+ // FIXME: We could avoid storing any args onto the stack that don't
+ // need to be in memory, because they come before the ellipsis in the
+ // parameter list (and thus could never be accessed through va_arg).
+ if (LF->getFunctionType ()->isVarArg ()) {
+ for (unsigned i = 0; i < 6; ++i) {
+ int FI = F->getFrameInfo()->CreateFixedObject(4, ArgOffset);
+ assert (IAR != IAREnd
+ && "About to dereference past end of IncomingArgRegs");
+ BuildMI (BB, V8::ST, 3).addFrameIndex (FI).addSImm (0).addReg (*IAR++);
+ ArgOffset += 4;
+ }
+ // Reset the pointers now that we're done.
+ ArgOffset = 68;
+ IAR = &IncomingArgRegs[0];
+ }
+
+ // Copy args out of their incoming hard regs or stack slots into virtual regs.
for (Function::aiterator I = LF->abegin(), E = LF->aend(); I != E; ++I) {
Argument &A = *I;
unsigned ArgReg = getReg (A);