case lltok::GlobalID: if (ParseUnnamedGlobal()) return true; break;
case lltok::GlobalVar: if (ParseNamedGlobal()) return true; break;
case lltok::Metadata: if (ParseStandaloneMetadata()) return true; break;
- case lltok::NamedMD: if (ParseNamedMetadata()) return true; break;
+ case lltok::NamedOrCustomMD: if (ParseNamedMetadata()) return true; break;
// The Global variable production with no name can have many different
// optional leading prefixes, the production is:
///ParseNamedMetadata:
/// !foo = !{ !1, !2 }
bool LLParser::ParseNamedMetadata() {
- assert(Lex.getKind() == lltok::NamedMD);
+ assert(Lex.getKind() == lltok::NamedOrCustomMD);
Lex.Lex();
std::string Name = Lex.getStrVal();
return false;
}
-/// ParseOptionalDbgInfo
+/// ParseOptionalCustomMetadata
/// ::= /* empty */
-/// ::= 'dbg' !42
-bool LLParser::ParseOptionalDbgInfo() {
+/// ::= !dbg !42
+bool LLParser::ParseOptionalCustomMetadata() {
- if (!EatIfPresent(lltok::kw_dbg))
+ std::string Name;
+ if (Lex.getKind() == lltok::NamedOrCustomMD) {
+ Name = Lex.getStrVal();
+ Lex.Lex();
+ } else
return false;
+
if (Lex.getKind() != lltok::Metadata)
return TokError("Expected '!' here");
Lex.Lex();
+
MetadataBase *Node;
if (ParseMDNode(Node)) return true;
MetadataContext &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)));
+ unsigned MDK = TheMetadata.getMDKind(Name.c_str());
+ if (!MDK)
+ MDK = TheMetadata.RegisterMDKind(Name.c_str());
+ MDsOnInst.push_back(std::make_pair(MDK, cast<MDNode>(Node)));
return false;
}
// FIXME: Handle customized metadata info attached with an instruction.
do {
- if (Lex.getKind() == lltok::kw_dbg) {
- if (ParseOptionalDbgInfo()) return true;
+ if (Lex.getKind() == lltok::NamedOrCustomMD) {
+ if (ParseOptionalCustomMetadata()) return true;
} else if (Lex.getKind() == lltok::kw_align) {
if (ParseOptionalAlignment(Alignment)) return true;
} else
if (ParseInstruction(Inst, BB, PFS)) return true;
if (EatIfPresent(lltok::comma))
- ParseOptionalDbgInfo();
+ ParseOptionalCustomMetadata();
// Set metadata attached with this instruction.
MetadataContext &TheMetadata = M->getContext().getMetadata();
//===----------------------------------------------------------------------===//
/// ParseRet - Parse a return instruction.
-/// ::= 'ret' void (',' 'dbg' !1)
-/// ::= 'ret' TypeAndValue (',' 'dbg' !1)
-/// ::= 'ret' TypeAndValue (',' TypeAndValue)+ (',' 'dbg' !1)
+/// ::= '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) {
if (Ty == Type::getVoidTy(Context)) {
if (EatIfPresent(lltok::comma))
- if (ParseOptionalDbgInfo()) return true;
+ if (ParseOptionalCustomMetadata()) return true;
Inst = ReturnInst::Create(Context);
return false;
}
if (ParseValue(Ty, RV, PFS)) return true;
if (EatIfPresent(lltok::comma)) {
- // Parse optional 'dbg'
- if (Lex.getKind() == lltok::kw_dbg) {
- if (ParseOptionalDbgInfo()) return true;
+ // Parse optional custom metadata, e.g. !dbg
+ if (Lex.getKind() == lltok::NamedOrCustomMD) {
+ if (ParseOptionalCustomMetadata()) 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
RVs.push_back(RV);
do {
- // If optional 'dbg' is seen then this is the end of MRV.
- if (Lex.getKind() == lltok::kw_dbg)
+ // If optional custom metadata, e.g. !dbg is seen then this is the
+ // end of MRV.
+ if (Lex.getKind() == lltok::NamedOrCustomMD)
break;
if (ParseTypeAndValue(RV, PFS)) return true;
RVs.push_back(RV);
}
}
if (EatIfPresent(lltok::comma))
- if (ParseOptionalDbgInfo()) return true;
+ if (ParseOptionalCustomMetadata()) return true;
Inst = ReturnInst::Create(Context, RV);
return false;
if (ParseType(Ty)) return true;
if (EatIfPresent(lltok::comma)) {
- if (Lex.getKind() == lltok::kw_align || Lex.getKind() == lltok::kw_dbg) {
+ if (Lex.getKind() == lltok::kw_align
+ || Lex.getKind() == lltok::NamedOrCustomMD) {
if (ParseOptionalInfo(Alignment)) return true;
} else {
if (ParseTypeAndValue(Size, SizeLoc, PFS)) return true;
/// RegisterMDKind - Register a new metadata kind and return its ID.
/// A metadata kind can be registered only once.
unsigned MetadataContext::RegisterMDKind(const char *Name) {
+ assert (validName(Name) && "Invalid custome metadata name!");
unsigned Count = MDHandlerNames.size();
StringMap<unsigned>::iterator I = MDHandlerNames.find(Name);
assert(I == MDHandlerNames.end() && "Already registered MDKind!");
return Count + 1;
}
+/// validName - Return true if Name is a valid custom metadata handler name.
+bool MetadataContext::validName(const char *Name) {
+ if (!Name)
+ return false;
+
+ if (!isalpha(*Name))
+ return false;
+
+ unsigned Length = strlen(Name);
+ unsigned Count = 1;
+ ++Name;
+ while (Name &&
+ (isalnum(*Name) || *Name == '_' || *Name == '-' || *Name == '.')) {
+ ++Name;
+ ++Count;
+ }
+ if (Length != Count)
+ return false;
+ return true;
+}
+
/// getMDKind - Return metadata kind. If the requested metadata kind
/// is not registered then return 0.
unsigned MetadataContext::getMDKind(const char *Name) {
+ assert (validName(Name) && "Invalid custome metadata name!");
StringMap<unsigned>::iterator I = MDHandlerNames.find(Name);
if (I == MDHandlerNames.end())
return 0;