summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBrian Gaeke <gaeke@uiuc.edu>2003-11-07 21:20:47 +0000
committerBrian Gaeke <gaeke@uiuc.edu>2003-11-07 21:20:47 +0000
commitc1a2be18eaf1e9862af973126be1f1ef975185f1 (patch)
treea93379c69344f2adb6b8c43f136c9e27a00266fc /lib
parent52709450c826efea71d6d94661e47d002b770ea1 (diff)
downloadllvm-c1a2be18eaf1e9862af973126be1f1ef975185f1.tar.gz
llvm-c1a2be18eaf1e9862af973126be1f1ef975185f1.tar.bz2
llvm-c1a2be18eaf1e9862af973126be1f1ef975185f1.tar.xz
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
Diffstat (limited to 'lib')
-rw-r--r--lib/ExecutionEngine/Interpreter/Execution.cpp35
-rw-r--r--lib/ExecutionEngine/Interpreter/Interpreter.h1
2 files changed, 36 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp
index 6a224b97fd..b04f974911 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 04baf36774..00784adb71 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!");