X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTableGen%2FTGParser.cpp;h=150397920421bf4fa5492442e852dd3277eafdca;hb=12af22e8cc217827cf4f118b0f5e4ebbda9925ae;hp=d020a8bdc1a3f3ecfabd798083089f1cef841918;hpb=c754b579ae1f3ce76b98dbf14bd88b3d653b34e7;p=oota-llvm.git diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index d020a8bdc1a..15039792042 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -236,8 +236,10 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, // Add all of the values in the superclass into the current def. for (unsigned i = 0, e = MCVals.size(); i != e; ++i) - if (AddValue(NewDef, SubMultiClass.RefRange.Start, MCVals[i])) + if (AddValue(NewDef, SubMultiClass.RefRange.Start, MCVals[i])) { + delete NewDef; return true; + } CurMC->DefPrototypes.push_back(NewDef); } @@ -348,6 +350,7 @@ bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){ TypedInit *IVal = dyn_cast(IterVals[i].IterValue); if (!IVal) { Error(Loc, "foreach iterator value is untyped"); + delete IterRec; return true; } @@ -356,6 +359,7 @@ bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){ if (SetValue(IterRec, Loc, IterVar->getName(), std::vector(), IVal)) { Error(Loc, "when instantiating this def"); + delete IterRec; return true; } @@ -372,6 +376,7 @@ bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){ IterRec->setName(GetNewAnonymousName()); else { Error(Loc, "def already exists: " + IterRec->getNameInitAsString()); + delete IterRec; return true; } } @@ -1182,6 +1187,15 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, Lex.Lex(); // Skip '#'. return ParseSimpleValue(CurRec, ItemType, Mode); case tgtok::IntVal: R = IntInit::get(Lex.getCurIntVal()); Lex.Lex(); break; + case tgtok::BinaryIntVal: { + auto BinaryVal = Lex.getCurBinaryIntVal(); + SmallVector Bits(BinaryVal.second); + for (unsigned i = 0, e = BinaryVal.second; i != e; ++i) + Bits[i] = BitInit::get(BinaryVal.first & (1LL << i)); + R = BitsInit::get(Bits); + Lex.Lex(); + break; + } case tgtok::StrVal: { std::string Val = Lex.getCurStrVal(); Lex.Lex(); @@ -1242,8 +1256,10 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, SCRef.Rec = Class; SCRef.TemplateArgs = ValueList; // Add info about the subclass to NewRec. - if (AddSubClass(NewRec, SCRef)) + if (AddSubClass(NewRec, SCRef)) { + delete NewRec; return nullptr; + } if (!CurMultiClass) { NewRec->resolveReferences(); Records.addDef(NewRec); @@ -1293,17 +1309,40 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, } Lex.Lex(); // eat the '}' - SmallVector NewBits(Vals.size()); + SmallVector NewBits; + // As we parse { a, b, ... }, 'a' is the highest bit, but we parse it + // first. We'll first read everything in to a vector, then we can reverse + // it to get the bits in the correct order for the BitsInit value. for (unsigned i = 0, e = Vals.size(); i != e; ++i) { + // FIXME: The following two loops would not be duplicated + // if the API was a little more orthogonal. + + // bits values are allowed to initialize n bits. + if (BitsInit *BI = dyn_cast(Vals[i])) { + for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) + NewBits.push_back(BI->getBit((e - i) - 1)); + continue; + } + // bits can also come from variable initializers. + if (VarInit *VI = dyn_cast(Vals[i])) { + if (BitsRecTy *BitsRec = dyn_cast(VI->getType())) { + for (unsigned i = 0, e = BitsRec->getNumBits(); i != e; ++i) + NewBits.push_back(VI->getBit((e - i) - 1)); + continue; + } + // Fallthrough to try convert this to a bit. + } + // All other values must be convertible to just a single bit. Init *Bit = Vals[i]->convertInitializerTo(BitRecTy::get()); if (!Bit) { Error(BraceLoc, "Element #" + utostr(i) + " (" + Vals[i]->getAsString()+ ") is not convertable to a bit"); return nullptr; } - NewBits[Vals.size()-i-1] = Bit; + NewBits.push_back(Bit); } + std::reverse(NewBits.begin(), NewBits.end()); return BitsInit::get(NewBits); } case tgtok::l_square: { // Value ::= '[' ValueList ']' @@ -1997,6 +2036,7 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { // Parse ObjectName and make a record for it. Record *CurRec; + bool CurRecOwnershipTransferred = false; Init *Name = ParseObjectName(CurMultiClass); if (Name) CurRec = new Record(Name, DefLoc, Records); @@ -2011,9 +2051,11 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { if (Records.getDef(CurRec->getNameInitAsString())) { Error(DefLoc, "def '" + CurRec->getNameInitAsString() + "' already defined"); + delete CurRec; return true; } Records.addDef(CurRec); + CurRecOwnershipTransferred = true; if (ParseObjectBody(CurRec)) return true; @@ -2023,8 +2065,10 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { // before this object, instantiated prior to defs derived from this object, // and this available for indirect name resolution when defs derived from // this object are instantiated. - if (ParseObjectBody(CurRec)) + if (ParseObjectBody(CurRec)) { + delete CurRec; return true; + } // Otherwise, a def inside a multiclass, add it to the multiclass. for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i) @@ -2032,11 +2076,15 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { == CurRec->getNameInit()) { Error(DefLoc, "def '" + CurRec->getNameInitAsString() + "' already defined in this multiclass!"); + delete CurRec; return true; } CurMultiClass->DefPrototypes.push_back(CurRec); - } else if (ParseObjectBody(CurRec)) + CurRecOwnershipTransferred = true; + } else if (ParseObjectBody(CurRec)) { + delete CurRec; return true; + } if (!CurMultiClass) // Def's in multiclasses aren't really defs. // See Record::setName(). This resolve step will see any new name @@ -2062,9 +2110,13 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { if (ProcessForeachDefs(CurRec, DefLoc)) { Error(DefLoc, "Could not process loops for def" + CurRec->getNameInitAsString()); + if (!CurRecOwnershipTransferred) + delete CurRec; return true; } + if (!CurRecOwnershipTransferred) + delete CurRec; return false; } @@ -2378,6 +2430,7 @@ InstantiateMulticlassDef(MultiClass &MC, Error(DefmPrefixRange.Start, "Could not resolve " + CurRec->getNameInitAsString() + ":NAME to '" + DefmPrefix->getAsUnquotedString() + "'"); + delete CurRec; return nullptr; } @@ -2409,6 +2462,7 @@ InstantiateMulticlassDef(MultiClass &MC, Error(DefmPrefixRange.Start, "def '" + CurRec->getNameInitAsString() + "' already defined, instantiating defm with subdef '" + DefProto->getNameInitAsString() + "'"); + delete CurRec; return nullptr; }