diff options
| author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2003-05-25 15:59:47 +0000 |
|---|---|---|
| committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2003-05-25 15:59:47 +0000 |
| commit | c9a0a1d728d2c310c9f12997e8ae7f9957a22aca (patch) | |
| tree | 622b158aee15ae2a6cb2a4164e5f217b2d03b8f0 /llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp | |
| parent | e2402c65d0e107afb49fb7fae12abc3011094f8c (diff) | |
| download | bcm5719-llvm-c9a0a1d728d2c310c9f12997e8ae7f9957a22aca.tar.gz bcm5719-llvm-c9a0a1d728d2c310c9f12997e8ae7f9957a22aca.zip | |
Add support for compiling varargs functions.
llvm-svn: 6325
Diffstat (limited to 'llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp')
| -rw-r--r-- | llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp b/llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp index be55e3b0a20..532a178a33b 100644 --- a/llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp +++ b/llvm/lib/Target/Sparc/PrologEpilogCodeInserter.cpp @@ -17,6 +17,8 @@ #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/Pass.h" #include "llvm/Function.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Intrinsics.h" namespace { struct InsertPrologEpilogCode : public MachineFunctionPass { @@ -93,6 +95,34 @@ void InsertPrologEpilogCode::InsertPrologCode(MachineFunction &MF) mvec.push_back(M); } + // For varargs function bodies, insert instructions to copy incoming + // register arguments for the ... list to the stack. + // The first K=6 arguments are always received via int arg regs + // (%i0 ... %i5 if K=6) . + // By copying the varargs arguments to the stack, va_arg() then can + // simply assume that all vararg arguments are in an array on the stack. + // + if (MF.getFunction()->getFunctionType()->isVarArg()) { + int numFixedArgs = MF.getFunction()->getFunctionType()->getNumParams(); + int numArgRegs = TM.getRegInfo().getNumOfIntArgRegs(); + if (numFixedArgs < numArgRegs) { + bool ignore; + int firstArgReg = TM.getRegInfo().getUnifiedRegNum( + TM.getRegInfo().getRegClassIDOfType(Type::IntTy), + SparcIntRegClass::i0); + int fpReg = TM.getFrameInfo().getIncomingArgBaseRegNum(); + int argSize = TM.getFrameInfo().getSizeOfEachArgOnStack(); + int firstArgOffset=TM.getFrameInfo().getFirstIncomingArgOffset(MF,ignore); + int nextArgOffset = firstArgOffset + numFixedArgs * argSize; + + for (int i=numFixedArgs; i < numArgRegs; ++i) { + mvec.push_back(BuildMI(V9::STX, 3).addMReg(firstArgReg+i). + addMReg(fpReg).addSImm(nextArgOffset)); + nextArgOffset += argSize; + } + } + } + MF.front().insert(MF.front().begin(), mvec.begin(), mvec.end()); } |

