[llvm-commits] [llvm] r92298 - in /llvm/trunk/lib/AsmParser: LLParser.cpp LLParser.h
Chris Lattner
sabre at nondot.org
Tue Dec 29 21:23:43 PST 2009
Author: lattner
Date: Tue Dec 29 23:23:43 2009
New Revision: 92298
URL: http://llvm.org/viewvc/llvm-project?rev=92298&view=rev
Log:
add facilities to start factoring instruction metadata parsing
out of each opcode's handler. Change ret over so far.
Modified:
llvm/trunk/lib/AsmParser/LLParser.cpp
llvm/trunk/lib/AsmParser/LLParser.h
Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=92298&r1=92297&r2=92298&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Tue Dec 29 23:23:43 2009
@@ -2813,10 +2813,26 @@
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 @@
/// 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 @@
/// ::= '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 @@
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 @@
}
Inst = ReturnInst::Create(Context, RV);
- return false;
+ return ExtraComma ? InstExtraComma : InstNormal;
}
Modified: llvm/trunk/lib/AsmParser/LLParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=92298&r1=92297&r2=92298&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.h (original)
+++ llvm/trunk/lib/AsmParser/LLParser.h Tue Dec 29 23:23:43 2009
@@ -316,12 +316,14 @@
bool ParseFunctionBody(Function &Fn);
bool ParseBasicBlock(PerFunctionState &PFS);
- // Instruction Parsing.
- bool ParseInstruction(Instruction *&Inst, BasicBlock *BB,
- PerFunctionState &PFS);
+ // Instruction Parsing. Each instruction parsing routine can return with a
+ // normal result, an error result, or return having eaten an extra comma.
+ enum InstResult { InstNormal = 0, InstError = 1, InstExtraComma = 2 };
+ int ParseInstruction(Instruction *&Inst, BasicBlock *BB,
+ PerFunctionState &PFS);
bool ParseCmpPredicate(unsigned &Pred, unsigned Opc);
- bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
+ int ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
bool ParseBr(Instruction *&Inst, PerFunctionState &PFS);
bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS);
More information about the llvm-commits
mailing list