Skip to content

Commit

Permalink
Parse Def ID as Value
Browse files Browse the repository at this point in the history
Allow def and defm IDs to be general values.  We need this for paste
functionality.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142522 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
greened committed Oct 19, 2011
1 parent 8592b2b commit a9e07dd
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 14 deletions.
54 changes: 41 additions & 13 deletions lib/TableGen/TGParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,18 +306,40 @@ static std::string GetNewAnonymousName() {

/// ParseObjectName - If an object name is specified, return it. Otherwise,
/// return an anonymous name.
/// ObjectName ::= ID
/// ObjectName ::= Value [ '#' Value ]*
/// ObjectName ::= /*empty*/
///
std::string TGParser::ParseObjectName() {
if (Lex.getCode() != tgtok::Id)
return GetNewAnonymousName();
Init *TGParser::ParseObjectName(MultiClass *CurMultiClass) {
switch (Lex.getCode()) {
case tgtok::colon:
case tgtok::semi:
case tgtok::l_brace:
// These are all of the tokens that can begin an object body.
// Some of these can also begin values but we disallow those cases
// because they are unlikely to be useful.
return StringInit::get(GetNewAnonymousName());
break;
default:
break;
}

std::string Ret = Lex.getCurStrVal();
Lex.Lex();
return Ret;
}
Record *CurRec = 0;
if (CurMultiClass)
CurRec = &CurMultiClass->Rec;

RecTy *Type = 0;
if (CurRec) {
const TypedInit *CurRecName =
dynamic_cast<const TypedInit *>(CurRec->getNameInit());
if (!CurRecName) {
TokError("Record name is not typed!");
return 0;
}
Type = CurRecName->getType();
}

return ParseValue(CurRec, Type, ParseNameMode);
}

/// ParseClassID - Parse and resolve a reference to a class name. This returns
/// null on error.
Expand Down Expand Up @@ -1692,7 +1714,7 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) {
Lex.Lex(); // Eat the 'def' token.

// Parse ObjectName and make a record for it.
Record *CurRec = new Record(ParseObjectName(), DefLoc, Records);
Record *CurRec = new Record(ParseObjectName(CurMultiClass), DefLoc, Records);

if (!CurMultiClass) {
// Top-level def definition.
Expand Down Expand Up @@ -2063,10 +2085,15 @@ bool TGParser::ResolveMulticlassDef(MultiClass &MC,
bool TGParser::ParseDefm(MultiClass *CurMultiClass) {
assert(Lex.getCode() == tgtok::Defm && "Unexpected token!");

std::string DefmPrefix;
Init *DefmPrefix = 0;
std::string DefmPrefixString;

if (Lex.Lex() == tgtok::Id) { // eat the defm.
DefmPrefix = Lex.getCurStrVal();
Lex.Lex(); // Eat the defm prefix.
DefmPrefix = ParseObjectName(CurMultiClass);
StringInit *DefmPrefixStringInit = dynamic_cast<StringInit *>(DefmPrefix);
if (DefmPrefixStringInit == 0)
return TokError("defm prefix is not a string");
DefmPrefixString = DefmPrefixStringInit->getValue();
}

SMLoc DefmPrefixLoc = Lex.getLoc();
Expand Down Expand Up @@ -2105,7 +2132,8 @@ bool TGParser::ParseDefm(MultiClass *CurMultiClass) {
for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) {
Record *DefProto = MC->DefPrototypes[i];

Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefix, DefmPrefixLoc);
Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefixString,
DefmPrefixLoc);

if (ResolveMulticlassDefArgs(*MC, CurRec, DefmPrefixLoc, SubClassLoc,
TArgs, TemplateVals, true/*Delete args*/))
Expand Down
2 changes: 1 addition & 1 deletion lib/TableGen/TGParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ class TGParser {
RecTy *ParseType();
Init *ParseOperation(Record *CurRec);
RecTy *ParseOperatorType();
std::string ParseObjectName();
Init *ParseObjectName(MultiClass *CurMultiClass);
Record *ParseClassID();
MultiClass *ParseMultiClassID();
Record *ParseDefmID();
Expand Down

0 comments on commit a9e07dd

Please sign in to comment.