diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2019-09-05 21:08:50 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2019-09-05 21:08:50 +0000 |
| commit | a47dc841cd6cd0cfcef72e00950662e9d1c58556 (patch) | |
| tree | b75d7e4aa7e0735ad3441f53df1fda0b9f09044d | |
| parent | 36b0571d2115acdf9de82c3f324a82caea3c007c (diff) | |
| download | bcm5719-llvm-a47dc841cd6cd0cfcef72e00950662e9d1c58556.tar.gz bcm5719-llvm-a47dc841cd6cd0cfcef72e00950662e9d1c58556.zip | |
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
| -rw-r--r-- | clang/include/clang/AST/Mangle.h | 8 | ||||
| -rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 15 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/mangle-ms-cxx17.cpp | 21 |
3 files changed, 30 insertions, 14 deletions
diff --git a/clang/include/clang/AST/Mangle.h b/clang/include/clang/AST/Mangle.h index e3c95ddb075..5db5c5b977d 100644 --- a/clang/include/clang/AST/Mangle.h +++ b/clang/include/clang/AST/Mangle.h @@ -56,7 +56,7 @@ private: llvm::DenseMap<const BlockDecl*, unsigned> GlobalBlockIds; llvm::DenseMap<const BlockDecl*, unsigned> LocalBlockIds; - llvm::DenseMap<const TagDecl*, uint64_t> AnonStructIds; + llvm::DenseMap<const NamedDecl*, uint64_t> AnonStructIds; public: ManglerKind getKind() const { return Kind; } @@ -82,9 +82,9 @@ public: return Result.first->second; } - uint64_t getAnonymousStructId(const TagDecl *TD) { - std::pair<llvm::DenseMap<const TagDecl *, uint64_t>::iterator, bool> - Result = AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size())); + uint64_t getAnonymousStructId(const NamedDecl *D) { + std::pair<llvm::DenseMap<const NamedDecl *, uint64_t>::iterator, bool> + Result = AnonStructIds.insert(std::make_pair(D, AnonStructIds.size())); return Result.first->second; } diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index f7a456e06ad..7ad8b52f7fd 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -868,16 +868,11 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, } if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(ND)) { - // FIXME: Invented mangling for decomposition declarations: - // [X,Y,Z] - // where X,Y,Z are the names of the bindings. - llvm::SmallString<128> Name("["); - for (auto *BD : DD->bindings()) { - if (Name.size() > 1) - Name += ','; - Name += BD->getDeclName().getAsIdentifierInfo()->getName(); - } - Name += ']'; + // Decomposition declarations are considered anonymous, and get + // numbered with a $S prefix. + llvm::SmallString<64> Name("$S"); + // Get a unique id for the anonymous struct. + Name += llvm::utostr(Context.getAnonymousStructId(DD) + 1); mangleSourceName(Name); break; } diff --git a/clang/test/CodeGenCXX/mangle-ms-cxx17.cpp b/clang/test/CodeGenCXX/mangle-ms-cxx17.cpp new file mode 100644 index 00000000000..897f0d6c9b1 --- /dev/null +++ b/clang/test/CodeGenCXX/mangle-ms-cxx17.cpp @@ -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(); |

