forked from OSchip/llvm-project
Implement Microsoft-compatible mangling for decomposition declarations.
Match cl.exe's mangling for decomposition declarations. Decomposition declarations are considered to be anonymous structs, and use the same convention as for anonymous struct/union declarations. Naming confirmed to match https://godbolt.org/z/K2osJa Patch from Eric Astor <epastor@google.com>! Differential Revision: https://reviews.llvm.org/D67202 llvm-svn: 371124
This commit is contained in:
parent
36b0571d21
commit
a47dc841cd
|
@ -56,7 +56,7 @@ private:
|
||||||
|
|
||||||
llvm::DenseMap<const BlockDecl*, unsigned> GlobalBlockIds;
|
llvm::DenseMap<const BlockDecl*, unsigned> GlobalBlockIds;
|
||||||
llvm::DenseMap<const BlockDecl*, unsigned> LocalBlockIds;
|
llvm::DenseMap<const BlockDecl*, unsigned> LocalBlockIds;
|
||||||
llvm::DenseMap<const TagDecl*, uint64_t> AnonStructIds;
|
llvm::DenseMap<const NamedDecl*, uint64_t> AnonStructIds;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ManglerKind getKind() const { return Kind; }
|
ManglerKind getKind() const { return Kind; }
|
||||||
|
@ -82,9 +82,9 @@ public:
|
||||||
return Result.first->second;
|
return Result.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t getAnonymousStructId(const TagDecl *TD) {
|
uint64_t getAnonymousStructId(const NamedDecl *D) {
|
||||||
std::pair<llvm::DenseMap<const TagDecl *, uint64_t>::iterator, bool>
|
std::pair<llvm::DenseMap<const NamedDecl *, uint64_t>::iterator, bool>
|
||||||
Result = AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
|
Result = AnonStructIds.insert(std::make_pair(D, AnonStructIds.size()));
|
||||||
return Result.first->second;
|
return Result.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -868,16 +868,11 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(ND)) {
|
if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(ND)) {
|
||||||
// FIXME: Invented mangling for decomposition declarations:
|
// Decomposition declarations are considered anonymous, and get
|
||||||
// [X,Y,Z]
|
// numbered with a $S prefix.
|
||||||
// where X,Y,Z are the names of the bindings.
|
llvm::SmallString<64> Name("$S");
|
||||||
llvm::SmallString<128> Name("[");
|
// Get a unique id for the anonymous struct.
|
||||||
for (auto *BD : DD->bindings()) {
|
Name += llvm::utostr(Context.getAnonymousStructId(DD) + 1);
|
||||||
if (Name.size() > 1)
|
|
||||||
Name += ',';
|
|
||||||
Name += BD->getDeclName().getAsIdentifierInfo()->getName();
|
|
||||||
}
|
|
||||||
Name += ']';
|
|
||||||
mangleSourceName(Name);
|
mangleSourceName(Name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
// RUN: %clang_cc1 -std=c++1z -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -fms-compatibility-version=19.10 | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK --check-prefix=MSVC2017
|
||||||
|
// RUN: %clang_cc1 -std=c++1z -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 -fms-compatibility-version=19.00 | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK --check-prefix=MSVC2015
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
int x;
|
||||||
|
double y;
|
||||||
|
};
|
||||||
|
S f();
|
||||||
|
|
||||||
|
// CHECK-DAG: "?$S1@@3US@@B"
|
||||||
|
const auto [x0, y0] = f();
|
||||||
|
// CHECK-DAG: "?$S2@@3US@@B"
|
||||||
|
const auto [x1, y1] = f();
|
||||||
|
|
||||||
|
static union {
|
||||||
|
int a;
|
||||||
|
double b;
|
||||||
|
};
|
||||||
|
|
||||||
|
// CHECK-DAG: "?$S4@@3US@@B"
|
||||||
|
const auto [x2, y2] = f();
|
Loading…
Reference in New Issue