diff options
author | Brian Gaeke <gaeke@uiuc.edu> | 2004-11-19 20:31:08 +0000 |
---|---|---|
committer | Brian Gaeke <gaeke@uiuc.edu> | 2004-11-19 20:31:08 +0000 |
commit | 4e459c465e861b5c97a1ccf96331a85df9ed0fef (patch) | |
tree | 764513d6d828053eebe5375e1047a662eb2b0702 /lib/Target/Sparc | |
parent | fd80b5c2603e1c6af4767672e614329c2a06faf1 (diff) |
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
Diffstat (limited to 'lib/Target/Sparc')
-rw-r--r-- | lib/Target/Sparc/SparcV8ISelSimple.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp index f596669562..bfb0c3e736 100644 --- a/lib/Target/Sparc/SparcV8ISelSimple.cpp +++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp @@ -343,10 +343,30 @@ void V8ISel::LoadArgumentsToVirtualRegs (Function *LF) { } } - // 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); |