Skip to content

Commit 4cdb597

Browse files
committed
Rename VTablePlaceholderDecl to MissingMemberDecl.
As such, we no longer insert two placeholders for initializers that need two vtable slots; instead we record that in the MissingMemberDecl. I can see MissingMemberDecl growing to be something we'd actually show to users, that can be used for other kinds of declarations that don't have vtable entries, but for now I'm not going to worry about any of that.
1 parent 47cddb1 commit 4cdb597

22 files changed

+94
-62
lines changed

include/swift/AST/Attr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ class DeclAttribute : public AttributeBase {
300300
OnModule = 1 << 31,
301301

302302
// Cannot have any attributes.
303-
OnVTablePlaceholder = 0,
303+
OnMissingMember = 0,
304304

305305
// More coarse-grained aggregations for use in Attr.def.
306306
OnOperator = OnInfixOperator|OnPrefixOperator|OnPostfixOperator,

include/swift/AST/Decl.h

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ enum class DescriptiveDeclKind : uint8_t {
140140
DidSet,
141141
EnumElement,
142142
Module,
143-
VTablePlaceholder,
143+
MissingMember,
144144
};
145145

146146
/// Keeps track of stage of circularity checking for the given protocol.
@@ -603,6 +603,15 @@ class alignas(1 << DeclAlignInBits) Decl {
603603
enum { NumIfConfigDeclBits = NumDeclBits + 1 };
604604
static_assert(NumIfConfigDeclBits <= 32, "fits in an unsigned");
605605

606+
class MissingMemberDeclBitfields {
607+
friend class MissingMemberDecl;
608+
unsigned : NumDeclBits;
609+
610+
unsigned NumberOfVTableEntries : 2;
611+
};
612+
enum { NumMissingMemberDeclBits = NumDeclBits + 2 };
613+
static_assert(NumMissingMemberDeclBits <= 32, "fits in an unsigned");
614+
606615
protected:
607616
union {
608617
DeclBitfields DeclBits;
@@ -627,6 +636,7 @@ class alignas(1 << DeclAlignInBits) Decl {
627636
ImportDeclBitfields ImportDeclBits;
628637
ExtensionDeclBitfields ExtensionDeclBits;
629638
IfConfigDeclBitfields IfConfigDeclBits;
639+
MissingMemberDeclBitfields MissingMemberDeclBits;
630640
uint32_t OpaqueBits;
631641
};
632642

@@ -6133,18 +6143,42 @@ class PostfixOperatorDecl : public OperatorDecl {
61336143
}
61346144
};
61356145

6136-
class VTablePlaceholderDecl : public Decl {
6146+
/// Represents a hole where a declaration should have been.
6147+
///
6148+
/// Among other things, these are used to keep vtable layout consistent.
6149+
class MissingMemberDecl : public Decl {
61376150
DeclName Name;
6138-
public:
6139-
VTablePlaceholderDecl(DeclContext *DC, DeclName name)
6140-
: Decl(DeclKind::VTablePlaceholder, DC), Name(name) {
6151+
6152+
MissingMemberDecl(DeclContext *DC, DeclName name, unsigned vtableEntries)
6153+
: Decl(DeclKind::MissingMember, DC), Name(name) {
6154+
MissingMemberDeclBits.NumberOfVTableEntries = vtableEntries;
6155+
assert(getNumberOfVTableEntries() == vtableEntries && "not enough bits");
61416156
setImplicit();
61426157
}
6158+
public:
6159+
static MissingMemberDecl *
6160+
forMethod(ASTContext &ctx, DeclContext *DC, DeclName name,
6161+
bool hasNormalVTableEntry) {
6162+
assert(!name || name.isCompoundName());
6163+
return new (ctx) MissingMemberDecl(DC, name, hasNormalVTableEntry);
6164+
}
6165+
6166+
static MissingMemberDecl *
6167+
forInitializer(ASTContext &ctx, DeclContext *DC, DeclName name,
6168+
bool hasNormalVTableEntry,
6169+
bool hasAllocatingVTableEntry) {
6170+
unsigned entries = hasNormalVTableEntry + hasAllocatingVTableEntry;
6171+
return new (ctx) MissingMemberDecl(DC, name, entries);
6172+
}
61436173

61446174
DeclName getFullName() const {
61456175
return Name;
61466176
}
61476177

6178+
unsigned getNumberOfVTableEntries() const {
6179+
return MissingMemberDeclBits.NumberOfVTableEntries;
6180+
}
6181+
61486182
SourceLoc getLoc() const {
61496183
return SourceLoc();
61506184
}
@@ -6154,7 +6188,7 @@ class VTablePlaceholderDecl : public Decl {
61546188
}
61556189

61566190
static bool classof(const Decl *D) {
6157-
return D->getKind() == DeclKind::VTablePlaceholder;
6191+
return D->getKind() == DeclKind::MissingMember;
61586192
}
61596193
};
61606194

include/swift/AST/DeclNodes.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ DECL(EnumCase, Decl)
9393
CONTEXT_DECL(TopLevelCode, Decl)
9494
DECL(IfConfig, Decl)
9595
DECL(PrecedenceGroup, Decl)
96-
DECL(VTablePlaceholder, Decl)
96+
DECL(MissingMember, Decl)
9797

9898
ABSTRACT_DECL(Operator, Decl)
9999
OPERATOR_DECL(InfixOperator, OperatorDecl)

include/swift/AST/PrintOptions.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ struct PrintOptions {
238238
/// Whether to skip parameter type attributes
239239
bool SkipParameterTypeAttributes = false;
240240

241-
/// Whether to skip vtable placeholder members.
242-
bool SkipVTablePlaceholders = true;
241+
/// Whether to skip placeholder members.
242+
bool SkipMissingMemberPlaceholders = true;
243243

244244
/// Whether to print a long attribute like '\@available' on a separate line
245245
/// from the declaration or other attributes.
@@ -492,7 +492,7 @@ struct PrintOptions {
492492
result.AbstractAccessors = false;
493493
result.PrintAccessibility = true;
494494
result.SkipEmptyExtensionDecls = false;
495-
result.SkipVTablePlaceholders = false;
495+
result.SkipMissingMemberPlaceholders = false;
496496
return result;
497497
}
498498

lib/AST/ASTDumper.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,10 +1111,10 @@ namespace {
11111111
PrintWithColorRAII(OS, ParenthesisColor) << ')';
11121112
}
11131113

1114-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *VTPD) {
1115-
printCommon(VTPD, "vtable_placeholder_decl ");
1114+
void visitMissingMemberDecl(MissingMemberDecl *MMD) {
1115+
printCommon(MMD, "missing_member_decl ");
11161116
PrintWithColorRAII(OS, IdentifierColor)
1117-
<< '\"' << VTPD->getFullName() << '\"';
1117+
<< '\"' << MMD->getFullName() << '\"';
11181118
PrintWithColorRAII(OS, ParenthesisColor) << ')';
11191119
}
11201120
};

lib/AST/ASTPrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1644,7 +1644,7 @@ bool swift::shouldPrint(const Decl *D, PrintOptions &Options) {
16441644
return false;
16451645
}
16461646

1647-
if (Options.SkipVTablePlaceholders && isa<VTablePlaceholderDecl>(D))
1647+
if (Options.SkipMissingMemberPlaceholders && isa<MissingMemberDecl>(D))
16481648
return false;
16491649

16501650
if (Options.SkipDeinit && isa<DestructorDecl>(D)) {
@@ -3218,7 +3218,7 @@ void PrintAST::visitPostfixOperatorDecl(PostfixOperatorDecl *decl) {
32183218

32193219
void PrintAST::visitModuleDecl(ModuleDecl *decl) { }
32203220

3221-
void PrintAST::visitVTablePlaceholderDecl(VTablePlaceholderDecl *decl) {
3221+
void PrintAST::visitMissingMemberDecl(MissingMemberDecl *decl) {
32223222
Printer << "/* placeholder for ";
32233223
recordDeclLoc(decl, [&]{ Printer << decl->getFullName(); });
32243224
Printer << " */";

lib/AST/ASTScope.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ ASTScope *ASTScope::createIfNeeded(const ASTScope *parent, Decl *decl) {
929929
case DeclKind::Param:
930930
case DeclKind::EnumElement:
931931
case DeclKind::IfConfig:
932-
case DeclKind::VTablePlaceholder:
932+
case DeclKind::MissingMember:
933933
// These declarations do not introduce scopes.
934934
return nullptr;
935935

lib/AST/ASTWalker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
260260
return doIt(SD->getElementTypeLoc());
261261
}
262262

263-
bool visitVTablePlaceholderDecl(VTablePlaceholderDecl *ID) {
263+
bool visitMissingMemberDecl(MissingMemberDecl *MMD) {
264264
return false;
265265
}
266266

lib/AST/Decl.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ DescriptiveDeclKind Decl::getDescriptiveKind() const {
133133
TRIVIAL_KIND(EnumElement);
134134
TRIVIAL_KIND(Param);
135135
TRIVIAL_KIND(Module);
136-
TRIVIAL_KIND(VTablePlaceholder);
136+
TRIVIAL_KIND(MissingMember);
137137

138138
case DeclKind::Enum:
139139
return cast<EnumDecl>(this)->getGenericParams()
@@ -268,7 +268,7 @@ StringRef Decl::getDescriptiveKindName(DescriptiveDeclKind K) {
268268
ENTRY(MutableAddressor, "mutableAddress accessor");
269269
ENTRY(EnumElement, "enum element");
270270
ENTRY(Module, "module");
271-
ENTRY(VTablePlaceholder, "vtable placeholder");
271+
ENTRY(MissingMember, "missing member placeholder");
272272
}
273273
#undef ENTRY
274274
llvm_unreachable("bad DescriptiveDeclKind");
@@ -738,7 +738,7 @@ ImportKind ImportDecl::getBestImportKind(const ValueDecl *VD) {
738738
case DeclKind::EnumCase:
739739
case DeclKind::IfConfig:
740740
case DeclKind::PrecedenceGroup:
741-
case DeclKind::VTablePlaceholder:
741+
case DeclKind::MissingMember:
742742
llvm_unreachable("not a ValueDecl");
743743

744744
case DeclKind::AssociatedType:
@@ -1374,7 +1374,7 @@ bool ValueDecl::isDefinition() const {
13741374
case DeclKind::PostfixOperator:
13751375
case DeclKind::IfConfig:
13761376
case DeclKind::PrecedenceGroup:
1377-
case DeclKind::VTablePlaceholder:
1377+
case DeclKind::MissingMember:
13781378
assert(!isa<ValueDecl>(this));
13791379
llvm_unreachable("non-value decls shouldn't get here");
13801380

@@ -1416,7 +1416,7 @@ bool ValueDecl::isInstanceMember() const {
14161416
case DeclKind::PostfixOperator:
14171417
case DeclKind::IfConfig:
14181418
case DeclKind::PrecedenceGroup:
1419-
case DeclKind::VTablePlaceholder:
1419+
case DeclKind::MissingMember:
14201420
llvm_unreachable("Not a ValueDecl");
14211421

14221422
case DeclKind::Class:

lib/FrontendTool/ReferenceDependencies.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ bool swift::emitReferenceDependencies(DiagnosticEngine &diags,
254254
case DeclKind::Constructor:
255255
case DeclKind::Destructor:
256256
case DeclKind::EnumElement:
257-
case DeclKind::VTablePlaceholder:
257+
case DeclKind::MissingMember:
258258
llvm_unreachable("cannot appear at the top level of a file");
259259
}
260260
}

lib/IDE/CodeCompletion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ CodeCompletionResult::getCodeCompletionDeclKind(const Decl *D) {
535535
case DeclKind::EnumCase:
536536
case DeclKind::TopLevelCode:
537537
case DeclKind::IfConfig:
538-
case DeclKind::VTablePlaceholder:
538+
case DeclKind::MissingMember:
539539
llvm_unreachable("not expecting such a declaration result");
540540
case DeclKind::Module:
541541
return CodeCompletionDeclKind::Module;

lib/IRGen/GenClass.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1491,9 +1491,8 @@ namespace {
14911491
}
14921492
}
14931493

1494-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *placeholder) {
1495-
// FIXME
1496-
IGM.fatal_unimplemented(SourceLoc(), "vtable placeholder");
1494+
void visitMissingMemberDecl(MissingMemberDecl *placeholder) {
1495+
llvm_unreachable("should not IRGen classes with missing members");
14971496
}
14981497

14991498
void addIVarInitializer() {

lib/IRGen/GenDecl.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class CategoryInitializerVisitor
167167
// We'll visit nested types separately if necessary.
168168
}
169169

170-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *placeholder) {}
170+
void visitMissingMemberDecl(MissingMemberDecl *placeholder) {}
171171

172172
void visitFuncDecl(FuncDecl *method) {
173173
if (!requiresObjCMethodDescriptor(method)) return;
@@ -381,7 +381,7 @@ class ObjCProtocolInitializerVisitor
381381
// We'll visit nested types separately if necessary.
382382
}
383383

384-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *placeholder) {}
384+
void visitMissingMemberDecl(MissingMemberDecl *placeholder) {}
385385

386386
void visitAbstractFunctionDecl(AbstractFunctionDecl *method) {
387387
llvm::Constant *name, *imp, *types;
@@ -1672,8 +1672,8 @@ void IRGenModule::emitGlobalDecl(Decl *D) {
16721672
case DeclKind::Destructor:
16731673
llvm_unreachable("there are no global destructor");
16741674

1675-
case DeclKind::VTablePlaceholder:
1676-
llvm_unreachable("there are no global vtable placeholders");
1675+
case DeclKind::MissingMember:
1676+
llvm_unreachable("there are no global member placeholders");
16771677

16781678
case DeclKind::TypeAlias:
16791679
case DeclKind::GenericTypeParam:
@@ -2934,7 +2934,7 @@ void IRGenModule::emitNestedTypeDecls(DeclRange members) {
29342934
case DeclKind::Destructor:
29352935
case DeclKind::EnumCase:
29362936
case DeclKind::EnumElement:
2937-
case DeclKind::VTablePlaceholder:
2937+
case DeclKind::MissingMember:
29382938
// Skip non-type members.
29392939
continue;
29402940

lib/SILGen/SILGen.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ class LLVM_LIBRARY_VISIBILITY SILGenModule : public ASTVisitor<SILGenModule> {
224224
void visitConstructorDecl(ConstructorDecl *d) {}
225225
void visitDestructorDecl(DestructorDecl *d) {}
226226
void visitModuleDecl(ModuleDecl *d) { }
227-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *d) {}
227+
void visitMissingMemberDecl(MissingMemberDecl *d) {}
228228

229229
void visitFuncDecl(FuncDecl *fd);
230230
void visitPatternBindingDecl(PatternBindingDecl *vd);

lib/SILGen/SILGenDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,7 @@ void SILGenModule::emitExternalDefinition(Decl *d) {
13931393
case DeclKind::PostfixOperator:
13941394
case DeclKind::PrecedenceGroup:
13951395
case DeclKind::Module:
1396-
case DeclKind::VTablePlaceholder:
1396+
case DeclKind::MissingMember:
13971397
llvm_unreachable("Not a valid external definition for SILGen");
13981398
}
13991399
}

lib/SILGen/SILGenType.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ class SILGenVTable : public SILVTableVisitor<SILGenVTable> {
203203
assert(result.second);
204204
(void) result;
205205
}
206+
207+
void addPlaceholder(MissingMemberDecl *) {}
206208
};
207209

208210
} // end anonymous namespace
@@ -823,7 +825,7 @@ class SILGenType : public TypeMemberVisitor<SILGenType> {
823825
void visitTypeAliasDecl(TypeAliasDecl *tad) {}
824826
void visitAbstractTypeParamDecl(AbstractTypeParamDecl *tpd) {}
825827
void visitModuleDecl(ModuleDecl *md) {}
826-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *) {}
828+
void visitMissingMemberDecl(MissingMemberDecl *) {}
827829
void visitNominalTypeDecl(NominalTypeDecl *ntd) {
828830
SILGenType(SGM, ntd).emitType();
829831
}
@@ -923,7 +925,7 @@ class SILGenExtension : public TypeMemberVisitor<SILGenExtension> {
923925
void visitTypeAliasDecl(TypeAliasDecl *tad) {}
924926
void visitAbstractTypeParamDecl(AbstractTypeParamDecl *tpd) {}
925927
void visitModuleDecl(ModuleDecl *md) {}
926-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *) {}
928+
void visitMissingMemberDecl(MissingMemberDecl *) {}
927929
void visitNominalTypeDecl(NominalTypeDecl *ntd) {
928930
SILGenType(SGM, ntd).emitType();
929931
}

lib/Sema/TypeCheckDecl.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,7 +1921,7 @@ static void checkAccessibility(TypeChecker &TC, const Decl *D) {
19211921

19221922
case DeclKind::Param:
19231923
case DeclKind::GenericTypeParam:
1924-
case DeclKind::VTablePlaceholder:
1924+
case DeclKind::MissingMember:
19251925
llvm_unreachable("does not have accessibility");
19261926

19271927
case DeclKind::IfConfig:
@@ -3920,7 +3920,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
39203920
TC.validateDecl(PGD);
39213921
}
39223922

3923-
void visitVTablePlaceholderDecl(VTablePlaceholderDecl *VTPD) {
3923+
void visitMissingMemberDecl(MissingMemberDecl *MMD) {
39243924
llvm_unreachable("should always be type-checked already");
39253925
}
39263926

@@ -7070,7 +7070,7 @@ void TypeChecker::validateDecl(ValueDecl *D) {
70707070
case DeclKind::PostfixOperator:
70717071
case DeclKind::PrecedenceGroup:
70727072
case DeclKind::IfConfig:
7073-
case DeclKind::VTablePlaceholder:
7073+
case DeclKind::MissingMember:
70747074
llvm_unreachable("not a value decl");
70757075

70767076
case DeclKind::Module:
@@ -7510,7 +7510,7 @@ void TypeChecker::validateAccessibility(ValueDecl *D) {
75107510
case DeclKind::PostfixOperator:
75117511
case DeclKind::PrecedenceGroup:
75127512
case DeclKind::IfConfig:
7513-
case DeclKind::VTablePlaceholder:
7513+
case DeclKind::MissingMember:
75147514
llvm_unreachable("not a value decl");
75157515

75167516
case DeclKind::Module:

0 commit comments

Comments
 (0)