[llvm-commits] [llvm] r82175 - in /llvm/trunk/lib/AsmParser: LLParser.cpp LLParser.h
Devang Patel
dpatel at apple.com
Thu Sep 17 16:04:48 PDT 2009
Author: dpatel
Date: Thu Sep 17 18:04:48 2009
New Revision: 82175
URL: http://llvm.org/viewvc/llvm-project?rev=82175&view=rev
Log:
Fix parsing of optional metadata for 'load', 'store' and 'alloc' instructions.
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=82175&r1=82174&r2=82175&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Thu Sep 17 18:04:48 2009
@@ -1025,6 +1025,28 @@
return false;
}
+/// ParseOptionalDbgInfo
+/// ::= /* empty */
+/// ::= 'dbg' !42
+bool LLParser::ParseOptionalDbgInfo() {
+
+ if (!EatIfPresent(lltok::kw_dbg))
+ return false;
+ if (Lex.getKind() != lltok::Metadata)
+ return TokError("Expected '!' here");
+ Lex.Lex();
+ MetadataBase *Node;
+ if (ParseMDNode(Node)) return true;
+
+ Metadata &TheMetadata = M->getContext().getMetadata();
+ unsigned MDDbgKind = TheMetadata.getMDKind("dbg");
+ if (!MDDbgKind)
+ MDDbgKind = TheMetadata.RegisterMDKind("dbg");
+ MDsOnInst.push_back(std::make_pair(MDDbgKind, cast<MDNode>(Node)));
+
+ return false;
+}
+
/// ParseOptionalAlignment
/// ::= /* empty */
/// ::= 'align' 4
@@ -1039,17 +1061,24 @@
return false;
}
-/// ParseOptionalCommaAlignment
-/// ::= /* empty */
-/// ::= ',' 'align' 4
-bool LLParser::ParseOptionalCommaAlignment(unsigned &Alignment) {
- Alignment = 0;
- if (!EatIfPresent(lltok::comma))
- return false;
- return ParseToken(lltok::kw_align, "expected 'align'") ||
- ParseUInt32(Alignment);
+/// ParseOptionalInfo
+/// ::= OptionalInfo (',' OptionalInfo)+
+bool LLParser::ParseOptionalInfo(unsigned &Alignment) {
+
+ // FIXME: Handle customized metadata info attached with an instruction.
+ do {
+ if (Lex.getKind() == lltok::kw_dbg) {
+ if (ParseOptionalDbgInfo()) return true;
+ } else if (Lex.getKind() == lltok::kw_align) {
+ if (ParseOptionalAlignment(Alignment)) return true;
+ } else
+ return true;
+ } while (EatIfPresent(lltok::comma));
+
+ return false;
}
+
/// ParseIndexList
/// ::= (',' uint32)+
bool LLParser::ParseIndexList(SmallVectorImpl<unsigned> &Indices) {
@@ -2621,26 +2650,18 @@
if (ParseToken(lltok::equal, "expected '=' after instruction name"))
return true;
}
-
+
if (ParseInstruction(Inst, BB, PFS)) return true;
-
- // Parse optional debug info
- if (Lex.getKind() == lltok::comma) {
- Lex.Lex();
- if (Lex.getKind() == lltok::kw_dbg) {
- Lex.Lex();
- if (Lex.getKind() != lltok::Metadata)
- return TokError("Expected '!' here");
- Lex.Lex();
- MetadataBase *N = 0;
- if (ParseMDNode(N)) return true;
- Metadata &TheMetadata = M->getContext().getMetadata();
- unsigned MDDbgKind = TheMetadata.getMDKind("dbg");
- if (!MDDbgKind)
- MDDbgKind = TheMetadata.RegisterMDKind("dbg");
- TheMetadata.setMD(MDDbgKind, cast<MDNode>(N), Inst);
- }
- }
+ if (EatIfPresent(lltok::comma))
+ ParseOptionalDbgInfo();
+
+ // Set metadata attached with this instruction.
+ Metadata &TheMetadata = M->getContext().getMetadata();
+ for (SmallVector<std::pair<MDKindID, MDNode *>, 2>::iterator
+ MDI = MDsOnInst.begin(), MDE = MDsOnInst.end(); MDI != MDE; ++MDI)
+ TheMetadata.setMD(MDI->first, MDI->second, Inst);
+ MDsOnInst.clear();
+
BB->getInstList().push_back(Inst);
// Set the name on the instruction.
@@ -2820,41 +2841,55 @@
//===----------------------------------------------------------------------===//
/// ParseRet - Parse a return instruction.
-/// ::= 'ret' void
-/// ::= 'ret' TypeAndValue
-/// ::= 'ret' TypeAndValue (',' TypeAndValue)+ [[obsolete: LLVM 3.0]]
+/// ::= 'ret' void (',' 'dbg' !1)
+/// ::= 'ret' TypeAndValue (',' 'dbg' !1)
+/// ::= 'ret' TypeAndValue (',' TypeAndValue)+ (',' 'dbg' !1)
+/// [[obsolete: LLVM 3.0]]
bool LLParser::ParseRet(Instruction *&Inst, BasicBlock *BB,
PerFunctionState &PFS) {
PATypeHolder Ty(Type::getVoidTy(Context));
if (ParseType(Ty, true /*void allowed*/)) return true;
if (Ty == Type::getVoidTy(Context)) {
+ if (EatIfPresent(lltok::comma))
+ if (ParseOptionalDbgInfo()) return true;
Inst = ReturnInst::Create(Context);
return false;
}
Value *RV;
if (ParseValue(Ty, RV, PFS)) return true;
-
- // The normal case is one return value.
- if (Lex.getKind() == lltok::comma) {
- // FIXME: LLVM 3.0 remove MRV support for 'ret i32 1, i32 2', requiring use
- // of 'ret {i32,i32} {i32 1, i32 2}'
- SmallVector<Value*, 8> RVs;
- RVs.push_back(RV);
-
- while (EatIfPresent(lltok::comma)) {
- if (ParseTypeAndValue(RV, PFS)) return true;
- RVs.push_back(RV);
- }
- RV = UndefValue::get(PFS.getFunction().getReturnType());
- for (unsigned i = 0, e = RVs.size(); i != e; ++i) {
- Instruction *I = InsertValueInst::Create(RV, RVs[i], i, "mrv");
- BB->getInstList().push_back(I);
- RV = I;
+ if (EatIfPresent(lltok::comma)) {
+ // Parse optional 'dbg'
+ if (Lex.getKind() == lltok::kw_dbg) {
+ if (ParseOptionalDbgInfo()) return true;
+ } else {
+ // The normal case is one return value.
+ // FIXME: LLVM 3.0 remove MRV support for 'ret i32 1, i32 2', requiring use
+ // of 'ret {i32,i32} {i32 1, i32 2}'
+ SmallVector<Value*, 8> RVs;
+ RVs.push_back(RV);
+
+ do {
+ // If optional 'dbg' is seen then this is the end of MRV.
+ if (Lex.getKind() == lltok::kw_dbg)
+ break;
+ if (ParseTypeAndValue(RV, PFS)) return true;
+ RVs.push_back(RV);
+ } while (EatIfPresent(lltok::comma));
+
+ RV = UndefValue::get(PFS.getFunction().getReturnType());
+ for (unsigned i = 0, e = RVs.size(); i != e; ++i) {
+ Instruction *I = InsertValueInst::Create(RV, RVs[i], i, "mrv");
+ BB->getInstList().push_back(I);
+ RV = I;
+ }
}
}
+ if (EatIfPresent(lltok::comma))
+ if (ParseOptionalDbgInfo()) return true;
+
Inst = ReturnInst::Create(Context, RV);
return false;
}
@@ -3393,8 +3428,8 @@
//===----------------------------------------------------------------------===//
/// ParseAlloc
-/// ::= 'malloc' Type (',' TypeAndValue)? (',' OptionalAlignment)?
-/// ::= 'alloca' Type (',' TypeAndValue)? (',' OptionalAlignment)?
+/// ::= 'malloc' Type (',' TypeAndValue)? (',' OptionalInfo)?
+/// ::= 'alloca' Type (',' TypeAndValue)? (',' OptionalInfo)?
bool LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS,
unsigned Opc) {
PATypeHolder Ty(Type::getVoidTy(Context));
@@ -3404,11 +3439,12 @@
if (ParseType(Ty)) return true;
if (EatIfPresent(lltok::comma)) {
- if (Lex.getKind() == lltok::kw_align) {
- if (ParseOptionalAlignment(Alignment)) return true;
- } else if (ParseTypeAndValue(Size, SizeLoc, PFS) ||
- ParseOptionalCommaAlignment(Alignment)) {
- return true;
+ if (Lex.getKind() == lltok::kw_align || Lex.getKind() == lltok::kw_dbg) {
+ if (ParseOptionalInfo(Alignment)) return true;
+ } else {
+ if (ParseTypeAndValue(Size, SizeLoc, PFS)) return true;
+ if (EatIfPresent(lltok::comma))
+ if (ParseOptionalInfo(Alignment)) return true;
}
}
@@ -3434,14 +3470,15 @@
}
/// ParseLoad
-/// ::= 'volatile'? 'load' TypeAndValue (',' 'align' i32)?
+/// ::= 'volatile'? 'load' TypeAndValue (',' OptionalInfo)?
bool LLParser::ParseLoad(Instruction *&Inst, PerFunctionState &PFS,
bool isVolatile) {
Value *Val; LocTy Loc;
- unsigned Alignment;
- if (ParseTypeAndValue(Val, Loc, PFS) ||
- ParseOptionalCommaAlignment(Alignment))
- return true;
+ unsigned Alignment = 0;
+ if (ParseTypeAndValue(Val, Loc, PFS)) return true;
+
+ if (EatIfPresent(lltok::comma))
+ if (ParseOptionalInfo(Alignment)) return true;
if (!isa<PointerType>(Val->getType()) ||
!cast<PointerType>(Val->getType())->getElementType()->isFirstClassType())
@@ -3456,12 +3493,14 @@
bool LLParser::ParseStore(Instruction *&Inst, PerFunctionState &PFS,
bool isVolatile) {
Value *Val, *Ptr; LocTy Loc, PtrLoc;
- unsigned Alignment;
+ unsigned Alignment = 0;
if (ParseTypeAndValue(Val, Loc, PFS) ||
ParseToken(lltok::comma, "expected ',' after store operand") ||
- ParseTypeAndValue(Ptr, PtrLoc, PFS) ||
- ParseOptionalCommaAlignment(Alignment))
+ ParseTypeAndValue(Ptr, PtrLoc, PFS))
return true;
+
+ if (EatIfPresent(lltok::comma))
+ if (ParseOptionalInfo(Alignment)) return true;
if (!isa<PointerType>(Ptr->getType()))
return Error(PtrLoc, "store operand must be a pointer");
Modified: llvm/trunk/lib/AsmParser/LLParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=82175&r1=82174&r2=82175&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.h (original)
+++ llvm/trunk/lib/AsmParser/LLParser.h Thu Sep 17 18:04:48 2009
@@ -48,7 +48,7 @@
/// MetadataCache - This map keeps track of parsed metadata constants.
std::map<unsigned, MetadataBase *> MetadataCache;
std::map<unsigned, std::pair<MetadataBase *, LocTy> > ForwardRefMDNodes;
-
+ SmallVector<std::pair<MDKindID, MDNode *>, 2> MDsOnInst;
struct UpRefRecord {
/// Loc - This is the location of the upref.
LocTy Loc;
@@ -128,7 +128,8 @@
bool ParseOptionalVisibility(unsigned &Visibility);
bool ParseOptionalCallingConv(CallingConv::ID &CC);
bool ParseOptionalAlignment(unsigned &Alignment);
- bool ParseOptionalCommaAlignment(unsigned &Alignment);
+ bool ParseOptionalDbgInfo();
+ bool ParseOptionalInfo(unsigned &Alignment);
bool ParseIndexList(SmallVectorImpl<unsigned> &Indices);
// Top-Level Entities
More information about the llvm-commits
mailing list