Skip to content

Commit 53d6814

Browse files
committed
RequirementMachine: Implement GenericSignature::getLayoutConstraint() query
1 parent 8053b91 commit 53d6814

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

include/swift/AST/RequirementMachine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class AssociatedTypeDecl;
2020
class CanGenericSignature;
2121
class CanType;
2222
class GenericSignature;
23+
class LayoutConstraint;
2324
class ProtocolDecl;
2425
class Requirement;
2526
class Type;
@@ -50,6 +51,7 @@ class RequirementMachine final {
5051
~RequirementMachine();
5152

5253
bool requiresClass(Type depType) const;
54+
LayoutConstraint getLayoutConstraint(Type depType) const;
5355
bool requiresProtocol(Type depType, const ProtocolDecl *proto) const;
5456
};
5557

lib/AST/GenericSignature.cpp

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,14 +452,44 @@ LayoutConstraint GenericSignatureImpl::getLayoutConstraint(Type type) const {
452452
assert(type->isTypeParameter() &&
453453
"Only type parameters can have layout constraints");
454454

455-
auto &builder = *getGenericSignatureBuilder();
456-
auto equivClass =
457-
builder.resolveEquivalenceClass(
458-
type,
459-
ArchetypeResolutionKind::CompleteWellFormed);
460-
if (!equivClass) return LayoutConstraint();
455+
auto computeViaGSB = [&]() {
456+
auto &builder = *getGenericSignatureBuilder();
457+
auto equivClass =
458+
builder.resolveEquivalenceClass(
459+
type,
460+
ArchetypeResolutionKind::CompleteWellFormed);
461+
if (!equivClass) return LayoutConstraint();
462+
463+
return equivClass->layout;
464+
};
465+
466+
auto computeViaRQM = [&]() {
467+
auto *machine = getRequirementMachine();
468+
return machine->getLayoutConstraint(type);
469+
};
470+
471+
auto &ctx = getASTContext();
472+
if (ctx.LangOpts.EnableRequirementMachine) {
473+
auto rqmResult = computeViaRQM();
474+
475+
#ifndef NDEBUG
476+
auto gsbResult = computeViaGSB();
477+
478+
if (gsbResult != rqmResult) {
479+
llvm::errs() << "RequirementMachine::getLayoutConstraint() is broken\n";
480+
llvm::errs() << "Generic signature: " << GenericSignature(this) << "\n";
481+
llvm::errs() << "Dependent type: "; type.dump(llvm::errs());
482+
llvm::errs() << "\n";
483+
llvm::errs() << "GenericSignatureBuilder says: " << gsbResult << "\n";
484+
llvm::errs() << "RequirementMachine says: " << rqmResult << "\n";
485+
abort();
486+
}
487+
#endif
461488

462-
return equivClass->layout;
489+
return rqmResult;
490+
} else {
491+
return computeViaGSB();
492+
}
463493
}
464494

465495
bool GenericSignatureImpl::areSameTypeParameterInContext(Type type1,

lib/AST/RequirementMachine/RequirementMachine.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,18 @@ bool RequirementMachine::requiresClass(Type depType) const {
353353
return (layout && layout->isClass());
354354
}
355355

356+
LayoutConstraint RequirementMachine::getLayoutConstraint(Type depType) const {
357+
auto term = Impl->Context.getMutableTermForType(depType->getCanonicalType(),
358+
/*proto=*/nullptr);
359+
Impl->System.simplify(term);
360+
361+
auto *equivClass = Impl->Map.lookUpEquivalenceClass(term);
362+
if (!equivClass)
363+
return LayoutConstraint();
364+
365+
return equivClass->getLayoutConstraint();
366+
}
367+
356368
bool RequirementMachine::requiresProtocol(Type depType,
357369
const ProtocolDecl *proto) const {
358370
auto term = Impl->Context.getMutableTermForType(depType->getCanonicalType(),

0 commit comments

Comments
 (0)