diff options
author | Chris Lattner <sabre@nondot.org> | 2001-06-11 15:04:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-06-11 15:04:40 +0000 |
commit | ee976f33713016a96e3fbb394b7d0c5465be25d7 (patch) | |
tree | 0ad7614e587c63accb1cabbe2cc2ff30acefdac5 /lib/Bytecode/Reader | |
parent | c24d2088dc3d79e3b7e38a358b4a71f156c06836 (diff) |
Updates to support
* Changes in PHI node structure
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Reader')
-rw-r--r-- | lib/Bytecode/Reader/InstructionReader.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp index 54ca869511..bbf0a5d5a1 100644 --- a/lib/Bytecode/Reader/InstructionReader.cpp +++ b/lib/Bytecode/Reader/InstructionReader.cpp @@ -104,24 +104,29 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, } else if (Raw.Opcode == Instruction::PHINode) { PHINode *PN = new PHINode(Raw.Ty); switch (Raw.NumOperands) { - case 0: cerr << "Invalid phi node encountered!\n"; + case 0: + case 1: + case 3: cerr << "Invalid phi node encountered!\n"; delete PN; return true; - case 1: PN->addIncoming(getValue(Raw.Ty, Raw.Arg1)); break; - case 2: PN->addIncoming(getValue(Raw.Ty, Raw.Arg1)); - PN->addIncoming(getValue(Raw.Ty, Raw.Arg2)); break; - case 3: PN->addIncoming(getValue(Raw.Ty, Raw.Arg1)); - PN->addIncoming(getValue(Raw.Ty, Raw.Arg2)); - PN->addIncoming(getValue(Raw.Ty, Raw.Arg3)); break; + case 2: PN->addIncoming(getValue(Raw.Ty, Raw.Arg1), + (BasicBlock*)getValue(Type::LabelTy, Raw.Arg2)); + break; default: - PN->addIncoming(getValue(Raw.Ty, Raw.Arg1)); - PN->addIncoming(getValue(Raw.Ty, Raw.Arg2)); - { + PN->addIncoming(getValue(Raw.Ty, Raw.Arg1), + (BasicBlock*)getValue(Type::LabelTy, Raw.Arg2)); + if (Raw.VarArgs->size() & 1) { + cerr << "PHI Node with ODD number of arguments!\n"; + delete PN; + return true; + } else { vector<unsigned> &args = *Raw.VarArgs; - for (unsigned i = 0; i < args.size(); i++) - PN->addIncoming(getValue(Raw.Ty, args[i])); + for (unsigned i = 0; i < args.size(); i+=2) + PN->addIncoming(getValue(Raw.Ty, args[i]), + (BasicBlock*)getValue(Type::LabelTy, args[i+1])); } - delete Raw.VarArgs; + delete Raw.VarArgs; + break; } Res = PN; return false; |