Skip to content

Commit da5caa5

Browse files
authored
Merge pull request #78127 from rintaro/astgen-interfacehash
[ASTGen] Syntax-tree based interface hash
2 parents 229c9bb + 21c9d3a commit da5caa5

File tree

14 files changed

+525
-48
lines changed

14 files changed

+525
-48
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class DeclNameLoc;
4242
class DeclNameRef;
4343
class DiagnosticArgument;
4444
class DiagnosticEngine;
45+
class Fingerprint;
4546
class Identifier;
4647
class IfConfigClauseRangeInfo;
4748
struct LabeledStmtInfo;
@@ -915,6 +916,8 @@ BridgedUnavailableFromAsyncAttr BridgedUnavailableFromAsyncAttr_createParsed(
915916
// MARK: Decls
916917
//===----------------------------------------------------------------------===//
917918

919+
struct BridgedFingerprint;
920+
918921
SWIFT_NAME("BridgedDecl.setAttrs(self:_:)")
919922
void BridgedDecl_setAttrs(BridgedDecl decl, BridgedDeclAttributes attrs);
920923

@@ -1034,9 +1037,10 @@ BridgedTypeAliasDecl BridgedTypeAliasDecl_createParsed(
10341037
BridgedSourceLoc cEqualLoc, BridgedTypeRepr underlyingType,
10351038
BridgedNullableTrailingWhereClause genericWhereClause);
10361039

1037-
SWIFT_NAME("BridgedExtensionDecl.setParsedMembers(self:_:)")
1040+
SWIFT_NAME("BridgedExtensionDecl.setParsedMembers(self:_:fingerprint:)")
10381041
void BridgedExtensionDecl_setParsedMembers(BridgedExtensionDecl decl,
1039-
BridgedArrayRef members);
1042+
BridgedArrayRef members,
1043+
BridgedFingerprint fingerprint);
10401044

10411045
SWIFT_NAME(
10421046
"BridgedEnumDecl.createParsed(_:declContext:enumKeywordLoc:name:nameLoc:"
@@ -1269,9 +1273,10 @@ SWIFT_NAME("BridgedNominalTypeDecl.isGenericAtAnyLevel(self:)")
12691273
BRIDGED_INLINE
12701274
bool BridgedNominalTypeDecl_isGenericAtAnyLevel(BridgedNominalTypeDecl decl);
12711275

1272-
SWIFT_NAME("BridgedNominalTypeDecl.setParsedMembers(self:_:)")
1276+
SWIFT_NAME("BridgedNominalTypeDecl.setParsedMembers(self:_:fingerprint:)")
12731277
void BridgedNominalTypeDecl_setParsedMembers(BridgedNominalTypeDecl decl,
1274-
BridgedArrayRef members);
1278+
BridgedArrayRef members,
1279+
BridgedFingerprint fingerprint);
12751280

12761281
SWIFT_NAME("BridgedNominalTypeDecl.getSourceLocation(self:)")
12771282
BRIDGED_INLINE BridgedSourceLoc BridgedNominalTypeDecl_getSourceLocation(BridgedNominalTypeDecl decl);
@@ -2327,6 +2332,13 @@ struct BridgedSubstitutionMap {
23272332
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformance getConformance(SwiftInt index) const;
23282333
};
23292334

2335+
struct BridgedFingerprint {
2336+
uint64_t v1;
2337+
uint64_t v2;
2338+
2339+
BRIDGED_INLINE swift::Fingerprint unbridged() const;
2340+
};
2341+
23302342
//===----------------------------------------------------------------------===//
23312343
// MARK: #if handling
23322344
//===----------------------------------------------------------------------===//

include/swift/AST/ASTBridgingImpl.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "swift/AST/SourceFile.h"
2525
#include "swift/AST/Stmt.h"
2626
#include "swift/Basic/Assertions.h"
27+
#include "swift/Basic/Fingerprint.h"
2728

2829
SWIFT_BEGIN_NULLABILITY_ANNOTATIONS
2930

@@ -461,6 +462,14 @@ BridgedConformance BridgedSubstitutionMap::getConformance(SwiftInt index) const
461462
return unbridged().getConformances()[index];
462463
}
463464

465+
//===----------------------------------------------------------------------===//
466+
// MARK: BridgedFingerprint
467+
//===----------------------------------------------------------------------===//
468+
469+
swift::Fingerprint BridgedFingerprint::unbridged() const {
470+
return swift::Fingerprint({this->v1, this->v2});
471+
}
472+
464473
//===----------------------------------------------------------------------===//
465474
// MARK: BridgedIfConfigClauseRangeInfo
466475
//===----------------------------------------------------------------------===//

include/swift/AST/ParseRequests.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class ParseAbstractFunctionBodyRequest
8888
struct SourceFileParsingResult {
8989
ArrayRef<ASTNode> TopLevelItems;
9090
std::optional<ArrayRef<Token>> CollectedTokens;
91-
std::optional<StableHasher> InterfaceHasher;
91+
std::optional<Fingerprint> Fingerprint;
9292
};
9393

9494
/// Parse the top-level items of a SourceFile.

include/swift/AST/SourceFile.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class SourceFile final : public FileUnit {
153153
/// this source file.
154154
///
155155
/// We only collect interface hash for primary input files.
156-
std::optional<StableHasher> InterfaceHasher;
156+
std::optional<Fingerprint> InterfaceHash;
157157

158158
/// The ID for the memory buffer containing this file's source.
159159
unsigned BufferID;
@@ -756,19 +756,14 @@ class SourceFile final : public FileUnit {
756756
return ParsingOpts.contains(ParsingFlags::EnableInterfaceHash);
757757
}
758758

759-
/// Retrieve a fingerprint value that summarizes the declarations in this
760-
/// source file.
759+
/// Retrieve a fingerprint value that summarizes the top-level declarations in
760+
/// this source file.
761761
///
762762
/// Note that the interface hash merely summarizes the top-level declarations
763763
/// in this file. Type body fingerprints are currently implemented such that
764764
/// they divert tokens away from the hasher used for fingerprints. That is,
765765
/// changes to the bodies of types and extensions will not result in a change
766-
/// to the interface hash.
767-
///
768-
/// In order for the interface hash to be enabled, this source file must be a
769-
/// primary and the compiler must be set in incremental mode. If this is not
770-
/// the case, this function will try to signal with an assert. It is useful
771-
/// to guard requests for the interface hash with \c hasInterfaceHash().
766+
/// to the source file interface hash.
772767
Fingerprint getInterfaceHash() const;
773768

774769
void dumpInterfaceHash(llvm::raw_ostream &out) {

include/swift/Bridging/ASTGen.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ void swift_ASTGen_buildTopLevelASTNodes(
6161
void *_Nonnull outputContext,
6262
void (*_Nonnull)(BridgedASTNode, void *_Nonnull));
6363

64+
BridgedFingerprint
65+
swift_ASTGen_getSourceFileFingerprint(void *_Nonnull sourceFile,
66+
BridgedASTContext astContext);
67+
6468
void swift_ASTGen_freeBridgedString(BridgedStringRef);
6569

6670
// MARK: - Regex parsing

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -338,12 +338,14 @@ BridgedTypeAliasDecl BridgedTypeAliasDecl_createParsed(
338338
return decl;
339339
}
340340

341-
static void setParsedMembers(IterableDeclContext *IDC,
342-
BridgedArrayRef bridgedMembers) {
341+
static void setParsedMembers(IterableDeclContext *IDC, BridgedArrayRef cMembers,
342+
BridgedFingerprint cFingerprint) {
343343
auto &ctx = IDC->getDecl()->getASTContext();
344344

345+
Fingerprint fp = cFingerprint.unbridged();
346+
345347
SmallVector<Decl *> members;
346-
for (auto *decl : bridgedMembers.unbridged<Decl *>()) {
348+
for (auto *decl : cMembers.unbridged<Decl *>()) {
347349
members.push_back(decl);
348350

349351
// Add any variables bound to the list of decls.
@@ -364,19 +366,22 @@ static void setParsedMembers(IterableDeclContext *IDC,
364366

365367
IDC->setMaybeHasOperatorDeclarations();
366368
IDC->setMaybeHasNestedClassDeclarations();
369+
// FIXME: Split requests. e.g. DeclMembersFingerprintRequest.
367370
ctx.evaluator.cacheOutput(
368371
ParseMembersRequest{IDC},
369-
FingerprintAndMembers{std::nullopt, ctx.AllocateCopy(members)});
372+
FingerprintAndMembers{fp, ctx.AllocateCopy(members)});
370373
}
371374

372-
void BridgedNominalTypeDecl_setParsedMembers(BridgedNominalTypeDecl bridgedDecl,
373-
BridgedArrayRef bridgedMembers) {
374-
setParsedMembers(bridgedDecl.unbridged(), bridgedMembers);
375+
void BridgedNominalTypeDecl_setParsedMembers(BridgedNominalTypeDecl cDecl,
376+
BridgedArrayRef cMembers,
377+
BridgedFingerprint cFingerprint) {
378+
setParsedMembers(cDecl.unbridged(), cMembers, cFingerprint);
375379
}
376380

377-
void BridgedExtensionDecl_setParsedMembers(BridgedExtensionDecl bridgedDecl,
378-
BridgedArrayRef bridgedMembers) {
379-
setParsedMembers(bridgedDecl.unbridged(), bridgedMembers);
381+
void BridgedExtensionDecl_setParsedMembers(BridgedExtensionDecl cDecl,
382+
BridgedArrayRef cMembers,
383+
BridgedFingerprint cFingerprint) {
384+
setParsedMembers(cDecl.unbridged(), cMembers, cFingerprint);
380385
}
381386

382387
static ArrayRef<InheritedEntry>

lib/AST/Module.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,10 +1551,8 @@ Fingerprint SourceFile::getInterfaceHash() const {
15511551
assert(hasInterfaceHash() && "Interface hash not enabled");
15521552
auto &eval = getASTContext().evaluator;
15531553
auto *mutableThis = const_cast<SourceFile *>(this);
1554-
std::optional<StableHasher> interfaceHasher =
1555-
evaluateOrDefault(eval, ParseSourceFileRequest{mutableThis}, {})
1556-
.InterfaceHasher;
1557-
return Fingerprint{StableHasher{interfaceHasher.value()}.finalize()};
1554+
return evaluateOrDefault(eval, ParseSourceFileRequest{mutableThis}, {})
1555+
.Fingerprint.value();
15581556
}
15591557

15601558
Fingerprint SourceFile::getInterfaceHashIncludingTypeMembers() const {

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,12 @@ extension BridgedSourceRange {
239239
}
240240
}
241241

242+
extension Fingerprint {
243+
var bridged: BridgedFingerprint {
244+
BridgedFingerprint(v1: self.core.0, v2: self.core.1)
245+
}
246+
}
247+
242248
/// Helper collection type that lazily concatenates two collections.
243249
struct ConcatCollection<C1: Collection, C2: Collection> where C1.Element == C2.Element {
244250
let c1: C1

lib/ASTGen/Sources/ASTGen/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ add_pure_swift_host_library(swiftASTGen STATIC CXX_INTEROP
88
Diagnostics.swift
99
DiagnosticsBridge.swift
1010
Exprs.swift
11+
Fingerprint.swift
1112
Generics.swift
1213
Literals.swift
1314
ParameterClause.swift
1415
Patterns.swift
1516
Regex.swift
1617
SourceFile.swift
18+
StableHasher.swift
1719
Stmts.swift
1820
TypeAttrs.swift
1921
Types.swift

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,14 @@ extension ASTGenVisitor {
131131
)
132132
decl.asDecl.setAttrs(attrs.attributes)
133133

134-
self.withDeclContext(decl.asDeclContext) {
135-
decl.setParsedMembers(self.generate(memberBlockItemList: node.memberBlock.members).lazy.bridgedArray(in: self))
134+
let members = self.withDeclContext(decl.asDeclContext) {
135+
self.generate(memberBlockItemList: node.memberBlock.members)
136136
}
137+
let fp = self.generateFingerprint(declGroup: node)
138+
decl.setParsedMembers(
139+
members.lazy.bridgedArray(in: self),
140+
fingerprint: fp.bridged
141+
)
137142

138143
return decl
139144
}
@@ -160,9 +165,14 @@ extension ASTGenVisitor {
160165
)
161166
decl.asDecl.setAttrs(attrs.attributes)
162167

163-
self.withDeclContext(decl.asDeclContext) {
164-
decl.setParsedMembers(self.generate(memberBlockItemList: node.memberBlock.members).lazy.bridgedArray(in: self))
168+
let members = self.withDeclContext(decl.asDeclContext) {
169+
self.generate(memberBlockItemList: node.memberBlock.members)
165170
}
171+
let fp = self.generateFingerprint(declGroup: node)
172+
decl.setParsedMembers(
173+
members.lazy.bridgedArray(in: self),
174+
fingerprint: fp.bridged
175+
)
166176

167177
return decl
168178
}
@@ -190,9 +200,14 @@ extension ASTGenVisitor {
190200
)
191201
decl.asDecl.setAttrs(attrs.attributes)
192202

193-
self.withDeclContext(decl.asDeclContext) {
194-
decl.setParsedMembers(self.generate(memberBlockItemList: node.memberBlock.members).lazy.bridgedArray(in: self))
203+
let members = self.withDeclContext(decl.asDeclContext) {
204+
self.generate(memberBlockItemList: node.memberBlock.members)
195205
}
206+
let fp = self.generateFingerprint(declGroup: node)
207+
decl.setParsedMembers(
208+
members.lazy.bridgedArray(in: self),
209+
fingerprint: fp.bridged
210+
)
196211

197212
return decl
198213
}
@@ -220,9 +235,14 @@ extension ASTGenVisitor {
220235
)
221236
decl.asDecl.setAttrs(attrs.attributes)
222237

223-
self.withDeclContext(decl.asDeclContext) {
224-
decl.setParsedMembers(self.generate(memberBlockItemList: node.memberBlock.members).lazy.bridgedArray(in: self))
238+
let members = self.withDeclContext(decl.asDeclContext) {
239+
self.generate(memberBlockItemList: node.memberBlock.members)
225240
}
241+
let fp = self.generateFingerprint(declGroup: node)
242+
decl.setParsedMembers(
243+
members.lazy.bridgedArray(in: self),
244+
fingerprint: fp.bridged
245+
)
226246

227247
return decl
228248
}
@@ -252,9 +272,14 @@ extension ASTGenVisitor {
252272
)
253273
decl.asDecl.setAttrs(attrs.attributes)
254274

255-
self.withDeclContext(decl.asDeclContext) {
256-
decl.setParsedMembers(self.generate(memberBlockItemList: node.memberBlock.members).lazy.bridgedArray(in: self))
275+
let members = self.withDeclContext(decl.asDeclContext) {
276+
self.generate(memberBlockItemList: node.memberBlock.members)
257277
}
278+
let fp = self.generateFingerprint(declGroup: node)
279+
decl.setParsedMembers(
280+
members.lazy.bridgedArray(in: self),
281+
fingerprint: fp.bridged
282+
)
258283

259284
return decl
260285
}
@@ -299,9 +324,14 @@ extension ASTGenVisitor {
299324
)
300325
decl.asDecl.setAttrs(attrs.attributes)
301326

302-
self.withDeclContext(decl.asDeclContext) {
303-
decl.setParsedMembers(self.generate(memberBlockItemList: node.memberBlock.members).lazy.bridgedArray(in: self))
327+
let members = self.withDeclContext(decl.asDeclContext) {
328+
self.generate(memberBlockItemList: node.memberBlock.members)
304329
}
330+
let fp = self.generateFingerprint(declGroup: node)
331+
decl.setParsedMembers(
332+
members.lazy.bridgedArray(in: self),
333+
fingerprint: fp.bridged
334+
)
305335

306336
return decl
307337
}

0 commit comments

Comments
 (0)