mirror of https://github.com/microsoft/clang.git
[MS ABI] Fix mangling issue with dynamic initializer stubs.
There are two types of dynamic initializer stubs. There's `dynamic initializer for 'x''(void) and `dynamic initializer for `static Foo::Bar StaticDataMember''(void) The second case is disambiguated from the first by the presence of a ? after the operator code. So the first will appear something like ?__E<name> while the second will appear something like ?__E?<name>. clang-cl was mangling these both the same though. This patch matches behavior with cl. Differential Revision: https://reviews.llvm.org/D51500 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341117 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dfb6e35a90
commit
f6b7bbdfa1
|
@ -3217,10 +3217,13 @@ void MicrosoftMangleContextImpl::mangleInitFiniStub(const VarDecl *D,
|
|||
msvc_hashing_ostream MHO(Out);
|
||||
MicrosoftCXXNameMangler Mangler(*this, MHO);
|
||||
Mangler.getStream() << "??__" << CharCode;
|
||||
Mangler.mangleName(D);
|
||||
if (D->isStaticDataMember()) {
|
||||
Mangler.getStream() << '?';
|
||||
Mangler.mangleName(D);
|
||||
Mangler.mangleVariableEncoding(D);
|
||||
Mangler.getStream() << '@';
|
||||
Mangler.getStream() << "@@";
|
||||
} else {
|
||||
Mangler.mangleName(D);
|
||||
}
|
||||
// This is the function class mangling. These stubs are global, non-variadic,
|
||||
// cdecl functions that return void and take no args.
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
// CHECK: @llvm.global_ctors = appending global [5 x { i32, void ()*, i8* }] [
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @"??__Eselectany1@@YAXXZ", i8* getelementptr inbounds (%struct.S, %struct.S* @"?selectany1@@3US@@A", i32 0, i32 0) },
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @"??__Eselectany2@@YAXXZ", i8* getelementptr inbounds (%struct.S, %struct.S* @"?selectany2@@3US@@A", i32 0, i32 0) },
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @"??__Es@?$ExportedTemplate@H@@2US@@A@YAXXZ", i8* getelementptr inbounds (%struct.S, %struct.S* @"?s@?$ExportedTemplate@H@@2US@@A", i32 0, i32 0) },
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @"??__Efoo@?$B@H@@2VA@@A@YAXXZ", i8* bitcast (%class.A* @"?foo@?$B@H@@2VA@@A" to i8*) },
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @"??__E?s@?$ExportedTemplate@H@@2US@@A@@YAXXZ", i8* getelementptr inbounds (%struct.S, %struct.S* @"?s@?$ExportedTemplate@H@@2US@@A", i32 0, i32 0) },
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @"??__E?foo@?$B@H@@2VA@@A@@YAXXZ", i8* bitcast (%class.A* @"?foo@?$B@H@@2VA@@A" to i8*) },
|
||||
// CHECK: { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_microsoft_abi_static_initializers.cpp, i8* null }
|
||||
// CHECK: ]
|
||||
|
||||
|
@ -231,18 +231,18 @@ void force_usage() {
|
|||
DynamicDLLImportInitVSMangling::switch_test3();
|
||||
}
|
||||
|
||||
// CHECK: define linkonce_odr dso_local void @"??__Efoo@?$B@H@@2VA@@A@YAXXZ"() {{.*}} comdat
|
||||
// CHECK: define linkonce_odr dso_local void @"??__E?foo@?$B@H@@2VA@@A@@YAXXZ"() {{.*}} comdat
|
||||
// CHECK-NOT: and
|
||||
// CHECK-NOT: ?_Bfoo@
|
||||
// CHECK: call x86_thiscallcc %class.A* @"??0A@@QAE@XZ"
|
||||
// CHECK: call i32 @atexit(void ()* @"??__Ffoo@?$B@H@@2VA@@A@YAXXZ")
|
||||
// CHECK: call i32 @atexit(void ()* @"??__F?foo@?$B@H@@2VA@@A@@YAXXZ")
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define linkonce_odr dso_local x86_thiscallcc %class.A* @"??0A@@QAE@XZ"({{.*}}) {{.*}} comdat
|
||||
|
||||
// CHECK: define linkonce_odr dso_local x86_thiscallcc void @"??1A@@QAE@XZ"({{.*}}) {{.*}} comdat
|
||||
|
||||
// CHECK: define internal void @"??__Ffoo@?$B@H@@2VA@@A@YAXXZ"
|
||||
// CHECK: define internal void @"??__F?foo@?$B@H@@2VA@@A@@YAXXZ"
|
||||
// CHECK: call x86_thiscallcc void @"??1A@@QAE@XZ"{{.*}}foo
|
||||
// CHECK: ret void
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ template <typename T> struct A { static const int x; };
|
|||
template <typename T> const int A<T>::x = f();
|
||||
template struct A<int>;
|
||||
// CHECK: @"?x@?$A@H@explicit_template_instantiation@@2HB" = weak_odr dso_local global i32 0, comdat, align 4
|
||||
// CHECK: @__cxx_init_fn_ptr.4 = private constant void ()* @"??__Ex@?$A@H@explicit_template_instantiation@@2HB@YAXXZ", section ".asdf", comdat($"?x@?$A@H@explicit_template_instantiation@@2HB")
|
||||
// CHECK: @__cxx_init_fn_ptr.4 = private constant void ()* @"??__E?x@?$A@H@explicit_template_instantiation@@2HB@@YAXXZ", section ".asdf", comdat($"?x@?$A@H@explicit_template_instantiation@@2HB")
|
||||
}
|
||||
|
||||
namespace implicit_template_instantiation {
|
||||
|
@ -52,7 +52,7 @@ template <typename T> struct A { static const int x; };
|
|||
template <typename T> const int A<T>::x = f();
|
||||
int g() { return A<int>::x; }
|
||||
// CHECK: @"?x@?$A@H@implicit_template_instantiation@@2HB" = linkonce_odr dso_local global i32 0, comdat, align 4
|
||||
// CHECK: @__cxx_init_fn_ptr.5 = private constant void ()* @"??__Ex@?$A@H@implicit_template_instantiation@@2HB@YAXXZ", section ".asdf", comdat($"?x@?$A@H@implicit_template_instantiation@@2HB")
|
||||
// CHECK: @__cxx_init_fn_ptr.5 = private constant void ()* @"??__E?x@?$A@H@implicit_template_instantiation@@2HB@@YAXXZ", section ".asdf", comdat($"?x@?$A@H@implicit_template_instantiation@@2HB")
|
||||
}
|
||||
|
||||
// ... and here's where we emitted user level ctors.
|
||||
|
|
Loading…
Reference in New Issue