diff options
author | Brian Gaeke <gaeke@uiuc.edu> | 2003-11-07 21:20:47 +0000 |
---|---|---|
committer | Brian Gaeke <gaeke@uiuc.edu> | 2003-11-07 21:20:47 +0000 |
commit | c1a2be18eaf1e9862af973126be1f1ef975185f1 (patch) | |
tree | a93379c69344f2adb6b8c43f136c9e27a00266fc | |
parent | 52709450c826efea71d6d94661e47d002b770ea1 (diff) | |
download | external_llvm-c1a2be18eaf1e9862af973126be1f1ef975185f1.zip external_llvm-c1a2be18eaf1e9862af973126be1f1ef975185f1.tar.gz external_llvm-c1a2be18eaf1e9862af973126be1f1ef975185f1.tar.bz2 |
Implement vaarg instruction. This is not quite perfect: 2003-08-11-VaListArg
still causes a crash. But it's better than before.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9794 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Execution.cpp | 35 | ||||
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Interpreter.h | 1 |
2 files changed, 36 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 6a224b9..b04f974 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -820,6 +820,41 @@ void Interpreter::visitVANextInst(VANextInst &I) { SetValue(&I, VAList, SF); } +#define IMPLEMENT_VAARG(TY) \ + case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break + +void Interpreter::visitVAArgInst(VAArgInst &I) { + ExecutionContext &SF = ECStack.back(); + + // Get the incoming valist element. LLI treats the valist as an integer. + GenericValue VAList = getOperandValue(I.getOperand(0), SF); + unsigned Argument = VAList.IntVal; + assert(Argument < SF.VarArgs.size() && + "Accessing past the last vararg argument!"); + GenericValue Dest, Src = SF.VarArgs[Argument]; + const Type *Ty = I.getType(); + switch (Ty->getPrimitiveID()) { + IMPLEMENT_VAARG(UByte); + IMPLEMENT_VAARG(SByte); + IMPLEMENT_VAARG(UShort); + IMPLEMENT_VAARG(Short); + IMPLEMENT_VAARG(UInt); + IMPLEMENT_VAARG(Int); + IMPLEMENT_VAARG(ULong); + IMPLEMENT_VAARG(Long); + IMPLEMENT_VAARG(Pointer); + IMPLEMENT_VAARG(Float); + IMPLEMENT_VAARG(Double); + IMPLEMENT_VAARG(Bool); + default: + std::cout << "Unhandled dest type for vaarg instruction: " << *Ty << "\n"; + abort(); + } + + // Set the Value of this Instruction. + SetValue(&I, Dest, SF); +} + //===----------------------------------------------------------------------===// // Dispatch and Execution Code //===----------------------------------------------------------------------===// diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h index 04baf36..00784ad 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.h +++ b/lib/ExecutionEngine/Interpreter/Interpreter.h @@ -130,6 +130,7 @@ public: void visitShl(ShiftInst &I); void visitShr(ShiftInst &I); void visitVANextInst(VANextInst &I); + void visitVAArgInst(VAArgInst &I); void visitInstruction(Instruction &I) { std::cerr << I; assert(0 && "Instruction not interpretable yet!"); |