Skip to content

Commit 0526f61

Browse files
author
git apple-llvm automerger
committed
Merge commit '6251adc64d3d' from llvm.org/main into next
2 parents 1a9f906 + 6251adc commit 0526f61

File tree

4 files changed

+113
-41
lines changed

4 files changed

+113
-41
lines changed

llvm/include/llvm/TableGen/Record.h

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ class Init {
317317
IK_VarBitInit,
318318
IK_VarDefInit,
319319
IK_LastTypedInit,
320-
IK_UnsetInit
320+
IK_UnsetInit,
321+
IK_ArgumentInit,
321322
};
322323

323324
private:
@@ -480,6 +481,39 @@ class UnsetInit : public Init {
480481
std::string getAsString() const override { return "?"; }
481482
};
482483

484+
// Represent an argument.
485+
class ArgumentInit : public Init, public FoldingSetNode {
486+
Init *Value;
487+
488+
protected:
489+
explicit ArgumentInit(Init *Value) : Init(IK_ArgumentInit), Value(Value) {}
490+
491+
public:
492+
ArgumentInit(const ArgumentInit &) = delete;
493+
ArgumentInit &operator=(const ArgumentInit &) = delete;
494+
495+
static bool classof(const Init *I) { return I->getKind() == IK_ArgumentInit; }
496+
497+
RecordKeeper &getRecordKeeper() const { return Value->getRecordKeeper(); }
498+
499+
static ArgumentInit *get(Init *Value);
500+
501+
Init *getValue() const { return Value; }
502+
503+
void Profile(FoldingSetNodeID &ID) const;
504+
505+
Init *resolveReferences(Resolver &R) const override;
506+
std::string getAsString() const override { return Value->getAsString(); }
507+
508+
bool isComplete() const override { return false; }
509+
bool isConcrete() const override { return false; }
510+
Init *getBit(unsigned Bit) const override { return Value->getBit(Bit); }
511+
Init *getCastTo(RecTy *Ty) const override { return Value->getCastTo(Ty); }
512+
Init *convertInitializerTo(RecTy *Ty) const override {
513+
return Value->convertInitializerTo(Ty);
514+
}
515+
};
516+
483517
/// 'true'/'false' - Represent a concrete initializer for a bit.
484518
class BitInit final : public TypedInit {
485519
friend detail::RecordKeeperImpl;
@@ -1278,8 +1312,9 @@ class DefInit : public TypedInit {
12781312

12791313
/// classname<targs...> - Represent an uninstantiated anonymous class
12801314
/// instantiation.
1281-
class VarDefInit final : public TypedInit, public FoldingSetNode,
1282-
public TrailingObjects<VarDefInit, Init *> {
1315+
class VarDefInit final : public TypedInit,
1316+
public FoldingSetNode,
1317+
public TrailingObjects<VarDefInit, ArgumentInit *> {
12831318
Record *Class;
12841319
DefInit *Def = nullptr; // after instantiation
12851320
unsigned NumArgs;
@@ -1298,7 +1333,7 @@ class VarDefInit final : public TypedInit, public FoldingSetNode,
12981333
static bool classof(const Init *I) {
12991334
return I->getKind() == IK_VarDefInit;
13001335
}
1301-
static VarDefInit *get(Record *Class, ArrayRef<Init *> Args);
1336+
static VarDefInit *get(Record *Class, ArrayRef<ArgumentInit *> Args);
13021337

13031338
void Profile(FoldingSetNodeID &ID) const;
13041339

@@ -1307,20 +1342,24 @@ class VarDefInit final : public TypedInit, public FoldingSetNode,
13071342

13081343
std::string getAsString() const override;
13091344

1310-
Init *getArg(unsigned i) const {
1345+
ArgumentInit *getArg(unsigned i) const {
13111346
assert(i < NumArgs && "Argument index out of range!");
1312-
return getTrailingObjects<Init *>()[i];
1347+
return getTrailingObjects<ArgumentInit *>()[i];
13131348
}
13141349

1315-
using const_iterator = Init *const *;
1350+
using const_iterator = ArgumentInit *const *;
13161351

1317-
const_iterator args_begin() const { return getTrailingObjects<Init *>(); }
1352+
const_iterator args_begin() const {
1353+
return getTrailingObjects<ArgumentInit *>();
1354+
}
13181355
const_iterator args_end () const { return args_begin() + NumArgs; }
13191356

13201357
size_t args_size () const { return NumArgs; }
13211358
bool args_empty() const { return NumArgs == 0; }
13221359

1323-
ArrayRef<Init *> args() const { return ArrayRef(args_begin(), NumArgs); }
1360+
ArrayRef<ArgumentInit *> args() const {
1361+
return ArrayRef(args_begin(), NumArgs);
1362+
}
13241363

13251364
Init *getBit(unsigned Bit) const override {
13261365
llvm_unreachable("Illegal bit reference off anonymous def");

llvm/lib/TableGen/Record.cpp

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct RecordKeeperImpl {
7070
BitInit TrueBitInit;
7171
BitInit FalseBitInit;
7272

73+
FoldingSet<ArgumentInit> TheArgumentInitPool;
7374
FoldingSet<BitsInit> TheBitsInitPool;
7475
std::map<int64_t, IntInit *> TheIntInitPool;
7576
StringMap<StringInit *, BumpPtrAllocator &> StringInitStringPool;
@@ -349,6 +350,8 @@ LLVM_DUMP_METHOD void Init::dump() const { return print(errs()); }
349350
RecordKeeper &Init::getRecordKeeper() const {
350351
if (auto *TyInit = dyn_cast<TypedInit>(this))
351352
return TyInit->getType()->getRecordKeeper();
353+
if (auto *ArgInit = dyn_cast<ArgumentInit>(this))
354+
return ArgInit->getRecordKeeper();
352355
return cast<UnsetInit>(this)->getRecordKeeper();
353356
}
354357

@@ -364,6 +367,37 @@ Init *UnsetInit::convertInitializerTo(RecTy *Ty) const {
364367
return const_cast<UnsetInit *>(this);
365368
}
366369

370+
static void ProfileArgumentInit(FoldingSetNodeID &ID, Init *Value) {
371+
ID.AddPointer(Value);
372+
}
373+
374+
void ArgumentInit::Profile(FoldingSetNodeID &ID) const {
375+
ProfileArgumentInit(ID, Value);
376+
}
377+
378+
ArgumentInit *ArgumentInit::get(Init *Value) {
379+
FoldingSetNodeID ID;
380+
ProfileArgumentInit(ID, Value);
381+
382+
RecordKeeper &RK = Value->getRecordKeeper();
383+
detail::RecordKeeperImpl &RKImpl = RK.getImpl();
384+
void *IP = nullptr;
385+
if (ArgumentInit *I = RKImpl.TheArgumentInitPool.FindNodeOrInsertPos(ID, IP))
386+
return I;
387+
388+
ArgumentInit *I = new (RKImpl.Allocator) ArgumentInit(Value);
389+
RKImpl.TheArgumentInitPool.InsertNode(I, IP);
390+
return I;
391+
}
392+
393+
Init *ArgumentInit::resolveReferences(Resolver &R) const {
394+
Init *NewValue = Value->resolveReferences(R);
395+
if (NewValue != Value)
396+
return ArgumentInit::get(NewValue);
397+
398+
return const_cast<ArgumentInit *>(this);
399+
}
400+
367401
BitInit *BitInit::get(RecordKeeper &RK, bool V) {
368402
return V ? &RK.getImpl().TrueBitInit : &RK.getImpl().FalseBitInit;
369403
}
@@ -2131,9 +2165,8 @@ RecTy *DefInit::getFieldType(StringInit *FieldName) const {
21312165

21322166
std::string DefInit::getAsString() const { return std::string(Def->getName()); }
21332167

2134-
static void ProfileVarDefInit(FoldingSetNodeID &ID,
2135-
Record *Class,
2136-
ArrayRef<Init *> Args) {
2168+
static void ProfileVarDefInit(FoldingSetNodeID &ID, Record *Class,
2169+
ArrayRef<ArgumentInit *> Args) {
21372170
ID.AddInteger(Args.size());
21382171
ID.AddPointer(Class);
21392172

@@ -2145,7 +2178,7 @@ VarDefInit::VarDefInit(Record *Class, unsigned N)
21452178
: TypedInit(IK_VarDefInit, RecordRecTy::get(Class)), Class(Class),
21462179
NumArgs(N) {}
21472180

2148-
VarDefInit *VarDefInit::get(Record *Class, ArrayRef<Init *> Args) {
2181+
VarDefInit *VarDefInit::get(Record *Class, ArrayRef<ArgumentInit *> Args) {
21492182
FoldingSetNodeID ID;
21502183
ProfileVarDefInit(ID, Class, Args);
21512184

@@ -2154,11 +2187,11 @@ VarDefInit *VarDefInit::get(Record *Class, ArrayRef<Init *> Args) {
21542187
if (VarDefInit *I = RK.TheVarDefInitPool.FindNodeOrInsertPos(ID, IP))
21552188
return I;
21562189

2157-
void *Mem = RK.Allocator.Allocate(totalSizeToAlloc<Init *>(Args.size()),
2158-
alignof(VarDefInit));
2190+
void *Mem = RK.Allocator.Allocate(
2191+
totalSizeToAlloc<ArgumentInit *>(Args.size()), alignof(VarDefInit));
21592192
VarDefInit *I = new (Mem) VarDefInit(Class, Args.size());
21602193
std::uninitialized_copy(Args.begin(), Args.end(),
2161-
I->getTrailingObjects<Init *>());
2194+
I->getTrailingObjects<ArgumentInit *>());
21622195
RK.TheVarDefInitPool.InsertNode(I, IP);
21632196
return I;
21642197
}
@@ -2188,7 +2221,7 @@ DefInit *VarDefInit::instantiate() {
21882221

21892222
for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
21902223
if (i < args_size())
2191-
R.set(TArgs[i], getArg(i));
2224+
R.set(TArgs[i], getArg(i)->getValue());
21922225
else
21932226
R.set(TArgs[i], NewRec->getValue(TArgs[i])->getValue());
21942227

@@ -2222,11 +2255,11 @@ DefInit *VarDefInit::instantiate() {
22222255
Init *VarDefInit::resolveReferences(Resolver &R) const {
22232256
TrackUnresolvedResolver UR(&R);
22242257
bool Changed = false;
2225-
SmallVector<Init *, 8> NewArgs;
2258+
SmallVector<ArgumentInit *, 8> NewArgs;
22262259
NewArgs.reserve(args_size());
22272260

2228-
for (Init *Arg : args()) {
2229-
Init *NewArg = Arg->resolveReferences(UR);
2261+
for (ArgumentInit *Arg : args()) {
2262+
auto *NewArg = cast<ArgumentInit>(Arg->resolveReferences(UR));
22302263
NewArgs.push_back(NewArg);
22312264
Changed |= NewArg != Arg;
22322265
}

llvm/lib/TableGen/TGParser.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace llvm {
3636
struct SubClassReference {
3737
SMRange RefRange;
3838
Record *Rec;
39-
SmallVector<Init*, 4> TemplateArgs;
39+
SmallVector<ArgumentInit *, 4> TemplateArgs;
4040

4141
SubClassReference() : Rec(nullptr) {}
4242

@@ -46,7 +46,7 @@ struct SubClassReference {
4646
struct SubMultiClassReference {
4747
SMRange RefRange;
4848
MultiClass *MC;
49-
SmallVector<Init*, 4> TemplateArgs;
49+
SmallVector<ArgumentInit *, 4> TemplateArgs;
5050

5151
SubMultiClassReference() : MC(nullptr) {}
5252

@@ -569,7 +569,7 @@ bool TGParser::addDefOne(std::unique_ptr<Record> Rec) {
569569
return false;
570570
}
571571

572-
bool TGParser::resolveArguments(Record *Rec, ArrayRef<Init *> ArgValues,
572+
bool TGParser::resolveArguments(Record *Rec, ArrayRef<ArgumentInit *> ArgValues,
573573
SMLoc Loc, ArgValueHandler ArgValueHandler) {
574574
ArrayRef<Init *> ArgNames = Rec->getTemplateArgs();
575575
assert(ArgValues.size() <= ArgNames.size() &&
@@ -579,7 +579,7 @@ bool TGParser::resolveArguments(Record *Rec, ArrayRef<Init *> ArgValues,
579579
// handle the (name, value) pair. If not and there was no default, complain.
580580
for (unsigned I = 0, E = ArgNames.size(); I != E; ++I) {
581581
if (I < ArgValues.size())
582-
ArgValueHandler(ArgNames[I], ArgValues[I]);
582+
ArgValueHandler(ArgNames[I], ArgValues[I]->getValue());
583583
else {
584584
Init *Default = Rec->getValue(ArgNames[I])->getValue();
585585
if (!Default->isComplete())
@@ -597,15 +597,16 @@ bool TGParser::resolveArguments(Record *Rec, ArrayRef<Init *> ArgValues,
597597
/// Resolve the arguments of class and set them to MapResolver.
598598
/// Returns true if failed.
599599
bool TGParser::resolveArgumentsOfClass(MapResolver &R, Record *Rec,
600-
ArrayRef<Init *> ArgValues, SMLoc Loc) {
600+
ArrayRef<ArgumentInit *> ArgValues,
601+
SMLoc Loc) {
601602
return resolveArguments(Rec, ArgValues, Loc,
602603
[&](Init *Name, Init *Value) { R.set(Name, Value); });
603604
}
604605

605606
/// Resolve the arguments of multiclass and store them into SubstStack.
606607
/// Returns true if failed.
607608
bool TGParser::resolveArgumentsOfMultiClass(SubstStack &Substs, MultiClass *MC,
608-
ArrayRef<Init *> ArgValues,
609+
ArrayRef<ArgumentInit *> ArgValues,
609610
Init *DefmName, SMLoc Loc) {
610611
// Add an implicit argument NAME.
611612
Substs.emplace_back(QualifiedNameOfImplicitName(MC), DefmName);
@@ -2596,7 +2597,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType,
25962597
return nullptr;
25972598
}
25982599

2599-
SmallVector<Init *, 8> Args;
2600+
SmallVector<ArgumentInit *, 8> Args;
26002601
Lex.Lex(); // consume the <
26012602
if (ParseTemplateArgValueList(Args, CurRec, Class))
26022603
return nullptr; // Error parsing value list.
@@ -3121,8 +3122,8 @@ void TGParser::ParseValueList(SmallVectorImpl<Init *> &Result, Record *CurRec,
31213122
// error was detected.
31223123
//
31233124
// TemplateArgList ::= '<' [Value {',' Value}*] '>'
3124-
bool TGParser::ParseTemplateArgValueList(SmallVectorImpl<Init *> &Result,
3125-
Record *CurRec, Record *ArgsRec) {
3125+
bool TGParser::ParseTemplateArgValueList(
3126+
SmallVectorImpl<ArgumentInit *> &Result, Record *CurRec, Record *ArgsRec) {
31263127

31273128
assert(Result.empty() && "Result vector is not empty");
31283129
ArrayRef<Init *> TArgs = ArgsRec->getTemplateArgs();
@@ -3144,7 +3145,7 @@ bool TGParser::ParseTemplateArgValueList(SmallVectorImpl<Init *> &Result,
31443145
Init *Value = ParseValue(CurRec, ItemType);
31453146
if (!Value)
31463147
return true;
3147-
Result.push_back(Value);
3148+
Result.push_back(ArgumentInit::get(Value));
31483149

31493150
if (consume(tgtok::greater)) // end of argument list?
31503151
return false;
@@ -4247,23 +4248,22 @@ bool TGParser::ParseFile() {
42474248
// inheritance, multiclass invocation, or anonymous class invocation.
42484249
// If necessary, replace an argument with a cast to the required type.
42494250
// The argument count has already been checked.
4250-
bool TGParser::CheckTemplateArgValues(SmallVectorImpl<llvm::Init *> &Values,
4251-
SMLoc Loc, Record *ArgsRec) {
4252-
4251+
bool TGParser::CheckTemplateArgValues(
4252+
SmallVectorImpl<llvm::ArgumentInit *> &Values, SMLoc Loc, Record *ArgsRec) {
42534253
ArrayRef<Init *> TArgs = ArgsRec->getTemplateArgs();
42544254

42554255
for (unsigned I = 0, E = Values.size(); I < E; ++I) {
42564256
RecordVal *Arg = ArgsRec->getValue(TArgs[I]);
42574257
RecTy *ArgType = Arg->getType();
42584258
auto *Value = Values[I];
42594259

4260-
if (TypedInit *ArgValue = dyn_cast<TypedInit>(Value)) {
4260+
if (TypedInit *ArgValue = dyn_cast<TypedInit>(Value->getValue())) {
42614261
auto *CastValue = ArgValue->getCastTo(ArgType);
42624262
if (CastValue) {
42634263
assert((!isa<TypedInit>(CastValue) ||
42644264
cast<TypedInit>(CastValue)->getType()->typeIsA(ArgType)) &&
42654265
"result of template arg value cast has wrong type");
4266-
Values[I] = CastValue;
4266+
Values[I] = ArgumentInit::get(CastValue);
42674267
} else {
42684268
PrintFatalError(Loc,
42694269
"Value specified for template argument '" +

llvm/lib/TableGen/TGParser.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,13 @@ class TGParser {
244244

245245
using ArgValueHandler = std::function<void(Init *, Init *)>;
246246
bool resolveArguments(
247-
Record *Rec, ArrayRef<Init *> ArgValues, SMLoc Loc,
247+
Record *Rec, ArrayRef<ArgumentInit *> ArgValues, SMLoc Loc,
248248
ArgValueHandler ArgValueHandler = [](Init *, Init *) {});
249249
bool resolveArgumentsOfClass(MapResolver &R, Record *Rec,
250-
ArrayRef<Init *> ArgValues, SMLoc Loc);
250+
ArrayRef<ArgumentInit *> ArgValues, SMLoc Loc);
251251
bool resolveArgumentsOfMultiClass(SubstStack &Substs, MultiClass *MC,
252-
ArrayRef<Init *> ArgValues, Init *DefmName,
253-
SMLoc Loc);
252+
ArrayRef<ArgumentInit *> ArgValues,
253+
Init *DefmName, SMLoc Loc);
254254

255255
private: // Parser methods.
256256
bool consume(tgtok::TokKind K);
@@ -288,7 +288,7 @@ class TGParser {
288288
IDParseMode Mode = ParseValueMode);
289289
void ParseValueList(SmallVectorImpl<llvm::Init*> &Result,
290290
Record *CurRec, RecTy *ItemType = nullptr);
291-
bool ParseTemplateArgValueList(SmallVectorImpl<llvm::Init *> &Result,
291+
bool ParseTemplateArgValueList(SmallVectorImpl<llvm::ArgumentInit *> &Result,
292292
Record *CurRec, Record *ArgsRec);
293293
void ParseDagArgList(
294294
SmallVectorImpl<std::pair<llvm::Init*, StringInit*>> &Result,
@@ -312,7 +312,7 @@ class TGParser {
312312
MultiClass *ParseMultiClassID();
313313
bool ApplyLetStack(Record *CurRec);
314314
bool ApplyLetStack(RecordsEntry &Entry);
315-
bool CheckTemplateArgValues(SmallVectorImpl<llvm::Init *> &Values,
315+
bool CheckTemplateArgValues(SmallVectorImpl<llvm::ArgumentInit *> &Values,
316316
SMLoc Loc, Record *ArgsRec);
317317
};
318318

0 commit comments

Comments
 (0)