Skip to content

Commit b937d0d

Browse files
committed
ABI checker: use dedicated mangled name field to diagnose mangled name changes
1 parent 5cf758d commit b937d0d

File tree

7 files changed

+45
-13
lines changed

7 files changed

+45
-13
lines changed

include/swift/APIDigester/ModuleAnalyzerNodes.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,13 @@ class SDKNodeDecl: public SDKNode {
360360
Optional<uint8_t> FixedBinaryOrder;
361361
PlatformIntroVersion introVersions;
362362
StringRef ObjCName;
363-
363+
mutable Optional<StringRef> demangledName;
364364
protected:
365365
SDKNodeDecl(SDKNodeInitInfo Info, SDKNodeKind Kind);
366366
virtual ~SDKNodeDecl() = default;
367367
public:
368368
StringRef getUsr() const { return Usr; }
369+
StringRef getDemangledName() const;
369370
StringRef getLocation() const { return Location; }
370371
StringRef getModuleName() const {return ModuleName;}
371372
StringRef getHeaderName() const;

include/swift/AST/USRGeneration.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,11 @@ bool printExtensionUSR(const ExtensionDecl *ED, raw_ostream &OS);
6363
/// \returns true if it failed, false on success.
6464
bool printDeclUSR(const Decl *D, raw_ostream &OS);
6565

66-
/// Demangle a mangle-name-based USR to a human readable name.
67-
std::string demangleUSR(StringRef mangled);
66+
/// Get mangled name from a USR.
67+
std::string getMangledNameFromUSR(StringRef usr);
68+
69+
/// Demangle a mangled name to a human readable name.
70+
std::string demangleMangledName(StringRef mangled);
6871

6972
} // namespace ide
7073
} // namespace swift

lib/APIDigester/ModuleAnalyzerNodes.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,19 @@ static bool hasSameParameterFlags(const SDKNodeType *Left, const SDKNodeType *Ri
817817
return true;
818818
}
819819

820+
StringRef SDKNodeDecl::getDemangledName() const {
821+
if (demangledName.hasValue()) {
822+
return *demangledName;
823+
}
824+
std::string mangled = MangledName.str();
825+
if (mangled.empty()) {
826+
mangled = getMangledNameFromUSR(Usr);
827+
}
828+
demangledName = Ctx.buffer(demangleMangledName(mangled));
829+
assert(demangledName.hasValue());
830+
return *demangledName;
831+
}
832+
820833
static bool isSDKNodeEqual(SDKContext &Ctx, const SDKNode &L, const SDKNode &R) {
821834
auto *LeftAlias = dyn_cast<SDKNodeTypeAlias>(&L);
822835
auto *RightAlias = dyn_cast<SDKNodeTypeAlias>(&R);
@@ -948,7 +961,7 @@ static bool isSDKNodeEqual(SDKContext &Ctx, const SDKNode &L, const SDKNode &R)
948961
if (Left->getFixedBinaryOrder() != Right->getFixedBinaryOrder())
949962
return false;
950963
}
951-
if (Left->getUsr() != Right->getUsr())
964+
if (Left->getDemangledName() != Right->getDemangledName())
952965
return false;
953966
LLVM_FALLTHROUGH;
954967
}
@@ -2582,9 +2595,10 @@ void swift::ide::api::SDKNodeDecl::diagnose(SDKNode *Right) {
25822595
emitDiag(Loc, diag::decl_reorder, getFixedBinaryOrder(),
25832596
RD->getFixedBinaryOrder());
25842597
}
2585-
if (getUsr() != RD->getUsr()) {
2586-
auto left = demangleUSR(getUsr());
2587-
auto right = demangleUSR(RD->getUsr());
2598+
{
2599+
// diagnose mangled name change.
2600+
auto left = getDemangledName();
2601+
auto right = RD->getDemangledName();
25882602
if (left != right) {
25892603
emitDiag(Loc, diag::demangled_name_changed, left, right);
25902604
}

lib/AST/USRGeneration.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,16 +256,23 @@ swift::USRGenerationRequest::evaluate(Evaluator &evaluator,
256256
return NewMangler.mangleDeclAsUSR(D, getUSRSpacePrefix());
257257
}
258258

259-
std::string ide::demangleUSR(StringRef mangled) {
260-
if (mangled.startswith(getUSRSpacePrefix())) {
261-
mangled = mangled.substr(getUSRSpacePrefix().size());
259+
std::string ide::getMangledNameFromUSR(StringRef usr) {
260+
if (usr.startswith(getUSRSpacePrefix())) {
261+
usr = usr.substr(getUSRSpacePrefix().size());
262262
}
263263
SmallString<128> buffer;
264264
buffer += "$s";
265-
buffer += mangled;
266-
mangled = buffer.str();
265+
buffer += usr;
266+
return buffer.str().str();
267+
}
268+
269+
std::string ide::demangleMangledName(StringRef mangled) {
267270
Demangler Dem;
268-
return nodeToString(Dem.demangleSymbol(mangled));
271+
std::string result = nodeToString(Dem.demangleSymbol(mangled));
272+
if (result.empty()) {
273+
return mangled.str();
274+
}
275+
return result;
269276
}
270277

271278
std::string

test/api-digester/Inputs/cake_baseline/cake.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,6 @@ open class AddingNewDesignatedInit {
232232
print(foo)
233233
}
234234
}
235+
236+
@_silgen_name("sil_name_before")
237+
public func silGenNameGiven() {}

test/api-digester/Inputs/cake_current/cake.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,3 +252,6 @@ public extension Float {
252252
}
253253

254254
infix operator <==> : AssignmentPrecedence
255+
256+
@_silgen_name("sil_name_after")
257+
public func silGenNameGiven() {}

test/api-digester/Outputs/Cake-abi.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ cake: Func S1.foo5(x:y:) has mangled name changing from 'cake.S1.foo5(x: Swift.I
1010
cake: Func Somestruct2.foo1(_:) has mangled name changing from 'static cake.Somestruct2.foo1(cake.C3) -> ()' to 'static cake.NSSomestruct2.foo1(cake.C1) -> ()'
1111
cake: Func ownershipChange(_:_:) has mangled name changing from 'cake.ownershipChange(inout Swift.Int, __shared Swift.Int) -> ()' to 'cake.ownershipChange(Swift.Int, __owned Swift.Int) -> ()'
1212
cake: Func returnFunctionTypeOwnershipChange() has mangled name changing from 'cake.returnFunctionTypeOwnershipChange() -> (cake.C1) -> ()' to 'cake.returnFunctionTypeOwnershipChange() -> (__owned cake.C1) -> ()'
13+
cake: Func silGenNameGiven() has mangled name changing from 'sil_name_before' to 'sil_name_after'
1314
cake: Protocol P3 has generic signature change from <Self : cake.P1, Self : cake.P2> to <Self : cake.P1, Self : cake.P4>
1415
cake: Struct Somestruct2 has mangled name changing from 'cake.Somestruct2' to 'cake.NSSomestruct2'
1516

0 commit comments

Comments
 (0)