mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Support stand alone metadata syntax.
!0 = constant metadata !{i32 21, i32 22} @llvm.blah = constant metadata !{i32 1000, i16 200, metadata !0} git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74630 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -109,6 +109,7 @@ bool LLParser::ParseTopLevelEntities() {
|
||||
case lltok::StringConstant: // FIXME: REMOVE IN LLVM 3.0
|
||||
case lltok::LocalVar: if (ParseNamedType()) return true; break;
|
||||
case lltok::GlobalVar: if (ParseNamedGlobal()) return true; break;
|
||||
case lltok::Metadata: if (ParseStandaloneMetadata()) return true; break;
|
||||
|
||||
// The Global variable production with no name can have many different
|
||||
// optional leading prefixes, the production is:
|
||||
@@ -355,6 +356,34 @@ bool LLParser::ParseNamedGlobal() {
|
||||
return ParseAlias(Name, NameLoc, Visibility);
|
||||
}
|
||||
|
||||
/// ParseStandaloneMetadata:
|
||||
/// !42 = !{...}
|
||||
bool LLParser::ParseStandaloneMetadata() {
|
||||
assert(Lex.getKind() == lltok::Metadata);
|
||||
Lex.Lex();
|
||||
unsigned MetadataID = 0;
|
||||
if (ParseUInt32(MetadataID))
|
||||
return true;
|
||||
if (MetadataCache.find(MetadataID) != MetadataCache.end())
|
||||
return TokError("Metadata id is already used");
|
||||
if (ParseToken(lltok::equal, "expected '=' here"))
|
||||
return true;
|
||||
|
||||
LocTy TyLoc;
|
||||
bool IsConstant;
|
||||
PATypeHolder Ty(Type::VoidTy);
|
||||
if (ParseGlobalType(IsConstant) ||
|
||||
ParseType(Ty, TyLoc))
|
||||
return true;
|
||||
|
||||
Constant *Init = 0;
|
||||
if (ParseGlobalValue(Ty, Init))
|
||||
return true;
|
||||
|
||||
MetadataCache[MetadataID] = Init;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// ParseAlias:
|
||||
/// ::= GlobalVar '=' OptionalVisibility 'alias' OptionalLinkage Aliasee
|
||||
/// Aliasee
|
||||
@@ -1596,6 +1625,17 @@ bool LLParser::ParseValID(ValID &ID) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Standalone metadata reference
|
||||
// !{ ..., !42, ... }
|
||||
unsigned MID = 0;
|
||||
if (!ParseUInt32(MID)) {
|
||||
std::map<unsigned, Constant *>::iterator I = MetadataCache.find(MID);
|
||||
if (I == MetadataCache.end())
|
||||
return TokError("Unknown metadata reference");
|
||||
ID.ConstantVal = I->second;
|
||||
return false;
|
||||
}
|
||||
|
||||
// MDString:
|
||||
// ::= '!' STRINGCONSTANT
|
||||
std::string Str;
|
||||
|
Reference in New Issue
Block a user