[llvm-branch-commits] [clang] 2ac5880 - Update MS ABI mangling for union constants based on new information from

Richard Smith via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Dec 2 12:22:51 PST 2020


Author: Richard Smith
Date: 2020-12-02T12:17:52-08:00
New Revision: 2ac58801873ab99dd5de48ad7557b76f1803100b

URL: https://github.com/llvm/llvm-project/commit/2ac58801873ab99dd5de48ad7557b76f1803100b
DIFF: https://github.com/llvm/llvm-project/commit/2ac58801873ab99dd5de48ad7557b76f1803100b.diff

LOG: Update MS ABI mangling for union constants based on new information from
Jon Caves.

Added: 
    

Modified: 
    clang/lib/AST/MicrosoftMangle.cpp
    clang/test/CodeGenCXX/mangle-class-nttp.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index b093b2514c19..1fba1392d0ed 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -1681,14 +1681,13 @@ void MicrosoftCXXNameMangler::mangleTemplateArgValue(QualType T,
   }
 
   case APValue::Union:
-    Out << '2';
+    Out << '7';
     mangleType(T, SourceRange(), QMM_Escape);
-    // FIXME: MSVC doesn't mangle the active member, only the type, leading to
-    // collisions if more than one member has the same type.
-    // FIXME: MSVC doesn't yet support unions with no active member, but
-    // there's an obvious mangling for that, so we use it.
-    if (const FieldDecl *FD = V.getUnionField())
-      mangleTemplateArgValue(FD->getType(), V.getUnionValue());
+    if (const FieldDecl *FD = V.getUnionField()) {
+      mangleUnqualifiedName(FD);
+      mangleTemplateArgValue(FD->getType(), V.getUnionValue(),
+                             /*WithType*/false);
+    }
     Out << '@';
     return;
 

diff  --git a/clang/test/CodeGenCXX/mangle-class-nttp.cpp b/clang/test/CodeGenCXX/mangle-class-nttp.cpp
index 9bb83fcf3246..579afd0a01be 100644
--- a/clang/test/CodeGenCXX/mangle-class-nttp.cpp
+++ b/clang/test/CodeGenCXX/mangle-class-nttp.cpp
@@ -120,16 +120,16 @@ template<E> void f() {}
 // CHECK: define weak_odr void @_Z1fIXL1EEEEvv(
 // FIXME: MSVC rejects this; check this is the mangling MSVC uses when they
 // start accepting.
-// MSABI: define {{.*}} @"??$f@$2TE@@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TE@@@@@YAXXZ"
 template void f<E{}>();
 // CHECK: define weak_odr void @_Z1fIXtl1EEEEvv(
-// MSABI: define {{.*}} @"??$f@$2TE@@H0A@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TE@@n at 0A@@@@YAXXZ"
 template void f<E(0)>();
 // CHECK: define weak_odr void @_Z1fIXtl1Edi1nLi42EEEEvv(
-// MSABI: define {{.*}} @"??$f@$2TE@@H0CK@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TE@@n at 0CK@@@@YAXXZ"
 template void f<E(42)>();
 // CHECK: define weak_odr void @_Z1fIXtl1Edi1fLf00000000EEEEvv(
-// MSABI: define {{.*}} @"??$f@$2TE@@MAA@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TE@@0AA@@@@YAXXZ"
 template void f<E(0.f)>();
 
 // immintrin.h vector types.
@@ -210,24 +210,22 @@ template<H2> void f() {}
 template<H3> void f() {}
 template<H4> void f() {}
 // CHECK: define weak_odr void @_Z1fIXL2H1EEEvv
-// MSABI: define {{.*}} @"??$f@$2TH1@@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TH1@@@@@YAXXZ"
 template void f<H1{}>();
 // CHECK: define weak_odr void @_Z1fIXL2H2EEEvv
-// MSABI: define {{.*}} @"??$f@$2TH2@@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TH2@@@@@YAXXZ"
 template void f<H2{}>();
 // CHECK: define weak_odr void @_Z1fIXtl2H3EEEvv
-// MSABI: define {{.*}} @"??$f@$2TH3@@H0A@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TH3@@a at 0A@@@@YAXXZ"
 template void f<H3{.a = 0}>();
 // CHECK: define weak_odr void @_Z1fIXtl2H3di1aLi1EEEEvv
-// MSABI: define {{.*}} @"??$f@$2TH3@@H00@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$7TH3@@a at 00@@@YAXXZ"
 template void f<H3{.a = 1}>();
-// FIXME: Leads to mangling collision under MS ABI; same mangling as the {.a = 0} case.
-#ifndef _WIN32
 // CHECK: define weak_odr void @_Z1fIXtl2H3di1bLi0EEEEvv
+// MSABI: define {{.*}} @"??$f@$7TH3@@b at 0A@@@@YAXXZ"
 template void f<H3{.b = 0}>();
-#endif
 // CHECK: define weak_odr void @_Z1fIXtl2H4EEEvv
-// MSABI: define {{.*}} @"??$f@$2UH4@@2TH2@@@@@@YAXXZ"
+// MSABI: define {{.*}} @"??$f@$2UH4@@7TH2@@@@@@YAXXZ"
 template void f<H4{}>();
 
 // Floating-point.


        


More information about the llvm-branch-commits mailing list