Skip to content

Commit

Permalink
[clang] Correct Microsoft mangling of lifetime extended temporary obj…
Browse files Browse the repository at this point in the history
…ects. (#85529)

Lifetime extended temporary objects that are bound to references with
static storage duration may have external linkage and therefore require
mangled symbol names. Clang uses an extension of the Microsoft ABI to
give these symbols an implicit name of '$RT' followed by a discriminator
and then mangles them similarly to the variable they are bound to.
Clang's mangling scheme differs from the one used by MSVC.

Previously, the `$RT<discriminator>` portion of the name was not
registered as a back reference candidate and this resulted in incorrect
back references for enclosing class and/or namespace scopes that might
be referenced in the type of the object.

This is an ABI change and has the potential to cause backward
compatibility issues with previous Clang releases. Since MSVC uses a
different mangling scheme, this change does not affect compatibility
with MSVC.

This fixes one of the name mangling concerns reported in #85423.
  • Loading branch information
tahonermann committed Mar 25, 2024
1 parent b282259 commit bea17ff
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
6 changes: 6 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ ABI Changes in This Version
inline member function that contains a static local variable with a dynamic
initializer is declared with ``__declspec(dllimport)``. (#GH83616).

- Fixed Microsoft name mangling of lifetime extended temporary objects. This
change corrects missing back reference registrations that could result in
incorrect back reference indexes and suprising demangled name results. Since
MSVC uses a different mangling for these objects, compatibility is not affected.
(#GH85423).

AST Dumping Potentially Breaking Changes
----------------------------------------

Expand Down
3 changes: 2 additions & 1 deletion clang/lib/AST/MicrosoftMangle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3911,7 +3911,8 @@ void MicrosoftMangleContextImpl::mangleReferenceTemporary(
msvc_hashing_ostream MHO(Out);
MicrosoftCXXNameMangler Mangler(*this, MHO);

Mangler.getStream() << "?$RT" << ManglingNumber << '@';
Mangler.getStream() << "?";
Mangler.mangleSourceName("$RT" + llvm::utostr(ManglingNumber));
Mangler.mangle(VD, "");
}

Expand Down
13 changes: 13 additions & 0 deletions clang/test/CodeGenCXX/mangle-ms-back-references.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
// RUN: %clang_cc1 -fms-extensions -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s

namespace NS {
// The name "RT1" for the name of the class below has been specifically
// chosen to ensure that back reference lookup does not match against the
// implicitly generated "$RT1" name of the reference temporary symbol.
struct RT1 {
static const RT1& singleton;
int i;
};
const RT1& RT1::singleton = RT1{1};
}
// CHECK: "?$RT1@singleton@RT1@NS@@2ABU23@B"
// CHECK: "?singleton@RT1@NS@@2ABU12@B"

void f1(const char* a, const char* b) {}
// CHECK: "?f1@@YAXPBD0@Z"

Expand Down

0 comments on commit bea17ff

Please sign in to comment.