From f8e621c4845664a9ad32b5f4b8fe3db2b134dac3 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 5 Aug 2010 17:53:23 +0000 Subject: Store CallInst and InvokeInst operands in a fixed order: function, arg0, arg1, ... git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@110352 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Module/KModule.cpp | 52 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 16 deletions(-) (limited to 'lib/Module') diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 2982ad67..8842febb 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -28,6 +28,7 @@ #include "llvm/Module.h" #include "llvm/PassManager.h" #include "llvm/ValueSymbolTable.h" +#include "llvm/Support/CallSite.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" #if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) @@ -481,6 +482,24 @@ KConstant::KConstant(llvm::Constant* _ct, unsigned _id, KInstruction* _ki) { /***/ +static int getOperandNum(Value *v, + std::map ®isterMap, + KModule *km, + KInstruction *ki) { + if (Instruction *inst = dyn_cast(v)) { + return registerMap[inst]; + } else if (Argument *a = dyn_cast(v)) { + return a->getArgNo(); + } else if (isa(v) || isa(v) || + isa(v)) { + return -1; + } else { + assert(isa(v)); + Constant *c = cast(v); + return -(km->getConstantID(c, ki) + 2); + } +} + KFunction::KFunction(llvm::Function *_function, KModule *km) : function(_function), @@ -524,24 +543,25 @@ KFunction::KFunction(llvm::Function *_function, ki = new KInstruction(); break; } - unsigned numOperands = it->getNumOperands(); ki->inst = it; - ki->operands = new int[numOperands]; ki->dest = registerMap[it]; - for (unsigned j=0; jgetOperand(j); - - if (Instruction *inst = dyn_cast(v)) { - ki->operands[j] = registerMap[inst]; - } else if (Argument *a = dyn_cast(v)) { - ki->operands[j] = a->getArgNo(); - } else if (isa(v) || isa(v) || - isa(v)) { - ki->operands[j] = -1; - } else { - assert(isa(v)); - Constant *c = cast(v); - ki->operands[j] = -(km->getConstantID(c, ki) + 2); + + if (isa(it) || isa(it)) { + CallSite cs(it); + unsigned numArgs = cs.arg_size(); + ki->operands = new int[numArgs+1]; + ki->operands[0] = getOperandNum(cs.getCalledValue(), registerMap, km, + ki); + for (unsigned j=0; joperands[j+1] = getOperandNum(v, registerMap, km, ki); + } + } else { + unsigned numOperands = it->getNumOperands(); + ki->operands = new int[numOperands]; + for (unsigned j=0; jgetOperand(j); + ki->operands[j] = getOperandNum(v, registerMap, km, ki); } } -- cgit 1.4.1