ABI checker: use dedicated mangled name field to diagnose mangled name changes

This commit is contained in:
Xi Ge
2021-10-21 10:51:19 -07:00
parent 5cf758d7ff
commit b937d0da86
7 changed files with 45 additions and 13 deletions

View File

@@ -817,6 +817,19 @@ static bool hasSameParameterFlags(const SDKNodeType *Left, const SDKNodeType *Ri
return true;
}
StringRef SDKNodeDecl::getDemangledName() const {
if (demangledName.hasValue()) {
return *demangledName;
}
std::string mangled = MangledName.str();
if (mangled.empty()) {
mangled = getMangledNameFromUSR(Usr);
}
demangledName = Ctx.buffer(demangleMangledName(mangled));
assert(demangledName.hasValue());
return *demangledName;
}
static bool isSDKNodeEqual(SDKContext &Ctx, const SDKNode &L, const SDKNode &R) {
auto *LeftAlias = dyn_cast<SDKNodeTypeAlias>(&L);
auto *RightAlias = dyn_cast<SDKNodeTypeAlias>(&R);
@@ -948,7 +961,7 @@ static bool isSDKNodeEqual(SDKContext &Ctx, const SDKNode &L, const SDKNode &R)
if (Left->getFixedBinaryOrder() != Right->getFixedBinaryOrder())
return false;
}
if (Left->getUsr() != Right->getUsr())
if (Left->getDemangledName() != Right->getDemangledName())
return false;
LLVM_FALLTHROUGH;
}
@@ -2582,9 +2595,10 @@ void swift::ide::api::SDKNodeDecl::diagnose(SDKNode *Right) {
emitDiag(Loc, diag::decl_reorder, getFixedBinaryOrder(),
RD->getFixedBinaryOrder());
}
if (getUsr() != RD->getUsr()) {
auto left = demangleUSR(getUsr());
auto right = demangleUSR(RD->getUsr());
{
// diagnose mangled name change.
auto left = getDemangledName();
auto right = RD->getDemangledName();
if (left != right) {
emitDiag(Loc, diag::demangled_name_changed, left, right);
}