159 std::vector<SmallVector<LetRecord, 4>> LetStack;
160 std::map<std::string, std::unique_ptr<MultiClass>> MultiClasses;
161 std::map<std::string, const RecTy *> TypeAliases;
165 std::vector<std::unique_ptr<ForeachLoop>> Loops;
174 std::unique_ptr<TGVarScope> CurScope;
190 bool NoWarnOnUnusedTemplateArgs =
false;
191 bool TrackReferenceLocs =
false;
195 const bool NoWarnOnUnusedTemplateArgs =
false,
196 const bool TrackReferenceLocs =
false)
197 : Lex(
SM, Macros), CurMultiClass(nullptr), Records(records),
198 NoWarnOnUnusedTemplateArgs(NoWarnOnUnusedTemplateArgs),
199 TrackReferenceLocs(TrackReferenceLocs) {}
211 return Lex.getDependencies();
215 CurScope = std::make_unique<TGVarScope>(std::move(CurScope));
219 return CurScope.get();
222 CurScope = std::make_unique<TGVarScope>(std::move(CurScope), Rec);
223 return CurScope.get();
226 CurScope = std::make_unique<TGVarScope>(std::move(CurScope),
Loop);
227 return CurScope.get();
230 CurScope = std::make_unique<TGVarScope>(std::move(CurScope), Multiclass);
231 return CurScope.get();
234 assert(ExpectedStackTop == CurScope.get() &&
235 "Mismatched pushes and pops of local variable scopes");
236 CurScope = CurScope->extractParent();
246 bool AllowSelfAssignment =
false,
bool OverrideDefLoc =
true,
257 std::vector<RecordsEntry> *Dest,
SMLoc *
Loc =
nullptr);
258 bool resolve(
const std::vector<RecordsEntry> &Source, SubstStack &Substs,
259 bool Final, std::vector<RecordsEntry> *Dest,
261 bool addDefOne(std::unique_ptr<Record> Rec);
263 using ArgValueHandler = std::function<void(
const Init *,
const Init *)>;
264 bool resolveArguments(
266 ArgValueHandler ArgValueHandler = [](
const Init *,
const Init *) {});
267 bool resolveArgumentsOfClass(MapResolver &R,
const Record *Rec,
270 bool resolveArgumentsOfMultiClass(SubstStack &Substs, MultiClass *MC,
272 const Init *DefmName, SMLoc Loc);
276 bool ParseObjectList(MultiClass *MC =
nullptr);
277 bool ParseObject(MultiClass *MC);
279 bool ParseMultiClass();
280 bool ParseDefm(MultiClass *CurMultiClass);
281 bool ParseDef(MultiClass *CurMultiClass);
284 bool ParseDefvar(Record *CurRec =
nullptr);
285 bool ParseDump(MultiClass *CurMultiClass, Record *CurRec =
nullptr);
286 bool ParseForeach(MultiClass *CurMultiClass);
287 bool ParseIf(MultiClass *CurMultiClass);
288 bool ParseIfBody(MultiClass *CurMultiClass, StringRef Kind);
289 bool ParseAssert(MultiClass *CurMultiClass, Record *CurRec =
nullptr);
290 bool ParseTopLevelLet(MultiClass *CurMultiClass);
291 LetModeAndName ParseLetModeAndName();
292 void ParseLetList(SmallVectorImpl<LetRecord> &Result);
294 bool ParseObjectBody(Record *CurRec);
295 bool ParseBody(Record *CurRec);
296 bool ParseBodyItem(Record *CurRec);
298 bool ParseTemplateArgList(Record *CurRec);
299 const Init *ParseDeclaration(Record *CurRec,
bool ParsingTemplateArgs);
300 const VarInit *ParseForeachDeclaration(
const Init *&ForeachListValue);
302 SubClassReference ParseSubClassReference(Record *CurRec,
bool isDefm);
303 SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC);
305 const Init *ParseIDValue(Record *CurRec,
const StringInit *Name,
306 SMRange NameLoc, IDParseMode
Mode = ParseValueMode);
307 const Init *ParseSimpleValue(Record *CurRec,
const RecTy *ItemType =
nullptr,
308 IDParseMode
Mode = ParseValueMode);
309 const Init *ParseValue(Record *CurRec,
const RecTy *ItemType =
nullptr,
310 IDParseMode
Mode = ParseValueMode);
311 void ParseValueList(SmallVectorImpl<const Init *> &Result, Record *CurRec,
312 const RecTy *ItemType =
nullptr);
313 bool ParseTemplateArgValueList(SmallVectorImpl<const ArgumentInit *> &Result,
314 SmallVectorImpl<SMLoc> &ArgLocs,
315 Record *CurRec,
const Record *ArgsRec);
316 void ParseDagArgList(
317 SmallVectorImpl<std::pair<const Init *, const StringInit *>> &Result,
319 bool ParseOptionalRangeList(SmallVectorImpl<unsigned> &Ranges);
320 bool ParseOptionalBitList(SmallVectorImpl<unsigned> &Ranges);
321 const TypedInit *ParseSliceElement(Record *CurRec);
322 const TypedInit *ParseSliceElements(Record *CurRec,
bool Single =
false);
323 void ParseRangeList(SmallVectorImpl<unsigned> &Result);
324 bool ParseRangePiece(SmallVectorImpl<unsigned> &Ranges,
325 const TypedInit *FirstItem =
nullptr);
326 const RecTy *ParseType();
327 const Init *ParseOperation(Record *CurRec,
const RecTy *ItemType);
328 const Init *ParseOperationSubstr(Record *CurRec,
const RecTy *ItemType);
329 const Init *ParseOperationFind(Record *CurRec,
const RecTy *ItemType);
330 const Init *ParseOperationListComprehension(Record *CurRec,
331 const RecTy *ItemType);
332 const Init *ParseOperationCond(Record *CurRec,
const RecTy *ItemType);
333 const Init *ParseOperationSwitch(Record *CurRec,
const RecTy *ItemType);
335 const Twine &ErrCtx);
336 const RecTy *ParseOperatorType();
337 const Init *ParseObjectName(MultiClass *CurMultiClass);
338 const Record *ParseClassID();
339 MultiClass *ParseMultiClassID();
340 bool ApplyLetStack(Record *CurRec);
341 bool ApplyLetStack(RecordsEntry &Entry);
342 bool CheckTemplateArgValues(SmallVectorImpl<const ArgumentInit *> &Values,
344 const Record *ArgsRec);
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
RecordsEntry - Holds exactly one of a Record, ForeachLoop, or AssertionInfo.
std::unique_ptr< ForeachLoop > Loop
std::unique_ptr< Record::AssertionInfo > Assertion
std::unique_ptr< Record::DumpInfo > Dump