diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2010-08-05 17:53:23 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2010-08-05 17:53:23 +0000 |
commit | f8e621c4845664a9ad32b5f4b8fe3db2b134dac3 (patch) | |
tree | a220aed601f4a0741cae0f25b347e87c3eac650e /lib/Module | |
parent | 535a4efdffdbd62d7c3956644cd6bdecdca7d18f (diff) | |
download | klee-f8e621c4845664a9ad32b5f4b8fe3db2b134dac3.tar.gz |
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
Diffstat (limited to 'lib/Module')
-rw-r--r-- | lib/Module/KModule.cpp | 52 |
1 files changed, 36 insertions, 16 deletions
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<Instruction*, unsigned> ®isterMap, + KModule *km, + KInstruction *ki) { + if (Instruction *inst = dyn_cast<Instruction>(v)) { + return registerMap[inst]; + } else if (Argument *a = dyn_cast<Argument>(v)) { + return a->getArgNo(); + } else if (isa<BasicBlock>(v) || isa<InlineAsm>(v) || + isa<MDNode>(v)) { + return -1; + } else { + assert(isa<Constant>(v)); + Constant *c = cast<Constant>(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; j<numOperands; j++) { - Value *v = it->getOperand(j); - - if (Instruction *inst = dyn_cast<Instruction>(v)) { - ki->operands[j] = registerMap[inst]; - } else if (Argument *a = dyn_cast<Argument>(v)) { - ki->operands[j] = a->getArgNo(); - } else if (isa<BasicBlock>(v) || isa<InlineAsm>(v) || - isa<MDNode>(v)) { - ki->operands[j] = -1; - } else { - assert(isa<Constant>(v)); - Constant *c = cast<Constant>(v); - ki->operands[j] = -(km->getConstantID(c, ki) + 2); + + if (isa<CallInst>(it) || isa<InvokeInst>(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; j<numArgs; j++) { + Value *v = cs.getArgument(j); + ki->operands[j+1] = getOperandNum(v, registerMap, km, ki); + } + } else { + unsigned numOperands = it->getNumOperands(); + ki->operands = new int[numOperands]; + for (unsigned j=0; j<numOperands; j++) { + Value *v = it->getOperand(j); + ki->operands[j] = getOperandNum(v, registerMap, km, ki); } } |