diff options
author | Chris Lattner <sabre@nondot.org> | 2009-12-30 05:23:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-12-30 05:23:43 +0000 |
commit | f1bc7ce7b362d2859349c7a1e2bc6df493d0f809 (patch) | |
tree | 0a5f49ff2fc360709867504b434be2431ae4db90 /lib/AsmParser/LLParser.cpp | |
parent | 628c13ad76fb4b7ce2f105c0e92644d1c39ee2f8 (diff) |
add facilities to start factoring instruction metadata parsing
out of each opcode's handler. Change ret over so far.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92298 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser/LLParser.cpp')
-rw-r--r-- | lib/AsmParser/LLParser.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index e8a98ea954..db87c71a22 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -2813,10 +2813,26 @@ bool LLParser::ParseBasicBlock(PerFunctionState &PFS) { return true; } - if (ParseInstruction(Inst, BB, PFS)) return true; - - if (EatIfPresent(lltok::comma)) - ParseOptionalCustomMetadata(); + switch (ParseInstruction(Inst, BB, PFS)) { + default: assert(0 && "Unknown ParseInstruction result!"); + case InstError: return true; + case InstNormal: + // With a normal result, we check to see if the instruction is followed by + // a comma and metadata. + if (EatIfPresent(lltok::comma)) + if (ParseOptionalCustomMetadata()) + return true; + break; + case InstExtraComma: + // If the instruction parser ate an extra comma at the end of it, it + // *must* be followed by metadata. + if (Lex.getKind() != lltok::MetadataVar) + return TokError("expected metadata after comma"); + // Parse it. + if (ParseOptionalCustomMetadata()) + return true; + break; + } // Set metadata attached with this instruction. for (SmallVector<std::pair<unsigned, MDNode *>, 2>::iterator @@ -2839,8 +2855,8 @@ bool LLParser::ParseBasicBlock(PerFunctionState &PFS) { /// ParseInstruction - Parse one of the many different instructions. /// -bool LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB, - PerFunctionState &PFS) { +int LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB, + PerFunctionState &PFS) { lltok::Kind Token = Lex.getKind(); if (Token == lltok::Eof) return TokError("found end of file when expecting more instructions"); @@ -3008,8 +3024,8 @@ bool LLParser::ParseCmpPredicate(unsigned &P, unsigned Opc) { /// ::= 'ret' TypeAndValue (',' !dbg, !1)* /// ::= 'ret' TypeAndValue (',' TypeAndValue)+ (',' !dbg, !1)* /// [[obsolete: LLVM 3.0]] -bool LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB, - PerFunctionState &PFS) { +int LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB, + PerFunctionState &PFS) { PATypeHolder Ty(Type::getVoidTy(Context)); if (ParseType(Ty, true /*void allowed*/)) return true; @@ -3021,10 +3037,11 @@ bool LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB, Value *RV; if (ParseValue(Ty, RV, PFS)) return true; + bool ExtraComma = false; if (EatIfPresent(lltok::comma)) { // Parse optional custom metadata, e.g. !dbg if (Lex.getKind() == lltok::MetadataVar) { - if (ParseOptionalCustomMetadata()) return true; + ExtraComma = true; } else { // The normal case is one return value. // FIXME: LLVM 3.0 remove MRV support for 'ret i32 1, i32 2', requiring @@ -3051,7 +3068,7 @@ bool LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB, } Inst = ReturnInst::Create(Context, RV); - return false; + return ExtraComma ? InstExtraComma : InstNormal; } |