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 | 874ddadf722a6a58cf3c5278f4d31187452d6a92 (patch) | |
tree | 3ae033e9bc6b9b7bd47c6d63db7800144d67c6b7 /llvm/lib/Bytecode | |
parent | 931ef3bf05e77704fb4ab16033666471b48883f7 (diff) | |
download | bcm5719-llvm-874ddadf722a6a58cf3c5278f4d31187452d6a92.tar.gz bcm5719-llvm-874ddadf722a6a58cf3c5278f4d31187452d6a92.zip |
Updates to support
* Changes in PHI node structure
llvm-svn: 25
Diffstat (limited to 'llvm/lib/Bytecode')
-rw-r--r-- | llvm/lib/Bytecode/Reader/InstructionReader.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/llvm/lib/Bytecode/Reader/InstructionReader.cpp b/llvm/lib/Bytecode/Reader/InstructionReader.cpp index 54ca8695115..bbf0a5d5a1b 100644 --- a/llvm/lib/Bytecode/Reader/InstructionReader.cpp +++ b/llvm/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; |