[clang] [ItaniumMangle] Use mangleType instead of mangleNameOrStandardSubstitution in mangleCXXCtorVTable function (PR #109970)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 27 00:17:29 PDT 2024
https://github.com/tcwzxx updated https://github.com/llvm/llvm-project/pull/109970
>From f9a25251087a160f2dc9e7f589aeb7b215bef60f Mon Sep 17 00:00:00 2001
From: tcwzxx <tcwzxx at gmail.com>
Date: Wed, 25 Sep 2024 19:19:08 +0800
Subject: [PATCH 1/5] Rename mangleNameOrStandardSubstitution to
mangleCXXRecordDecl and add Record to the substitution
---
clang/lib/AST/ItaniumMangle.cpp | 18 ++++++++++--------
clang/test/CodeGenCXX/mangle.cpp | 24 ++++++++++++++++++++++++
2 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b6e1da0c3192da..2c3321ad564781 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -464,7 +464,7 @@ class CXXNameMangler {
void mangleSeqID(unsigned SeqID);
void mangleName(GlobalDecl GD);
void mangleType(QualType T);
- void mangleNameOrStandardSubstitution(const NamedDecl *ND);
+ void mangleCXXRecordDecl(const CXXRecordDecl *Record);
void mangleLambdaSig(const CXXRecordDecl *Lambda);
void mangleModuleNamePrefix(StringRef Name, bool IsPartition = false);
void mangleVendorQualifier(StringRef Name);
@@ -3029,9 +3029,11 @@ void CXXNameMangler::mangleType(QualType T) {
addSubstitution(T);
}
-void CXXNameMangler::mangleNameOrStandardSubstitution(const NamedDecl *ND) {
- if (!mangleStandardSubstitution(ND))
- mangleName(ND);
+void CXXNameMangler::mangleCXXRecordDecl(const CXXRecordDecl *Record) {
+ if (mangleSubstitution(Record))
+ return;
+ mangleName(Record);
+ addSubstitution(Record);
}
void CXXNameMangler::mangleType(const BuiltinType *T) {
@@ -7309,7 +7311,7 @@ void ItaniumMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *RD,
// <special-name> ::= TV <type> # virtual table
CXXNameMangler Mangler(*this, Out);
Mangler.getStream() << "_ZTV";
- Mangler.mangleNameOrStandardSubstitution(RD);
+ Mangler.mangleCXXRecordDecl(RD);
}
void ItaniumMangleContextImpl::mangleCXXVTT(const CXXRecordDecl *RD,
@@ -7317,7 +7319,7 @@ void ItaniumMangleContextImpl::mangleCXXVTT(const CXXRecordDecl *RD,
// <special-name> ::= TT <type> # VTT structure
CXXNameMangler Mangler(*this, Out);
Mangler.getStream() << "_ZTT";
- Mangler.mangleNameOrStandardSubstitution(RD);
+ Mangler.mangleCXXRecordDecl(RD);
}
void ItaniumMangleContextImpl::mangleCXXCtorVTable(const CXXRecordDecl *RD,
@@ -7327,10 +7329,10 @@ void ItaniumMangleContextImpl::mangleCXXCtorVTable(const CXXRecordDecl *RD,
// <special-name> ::= TC <type> <offset number> _ <base type>
CXXNameMangler Mangler(*this, Out);
Mangler.getStream() << "_ZTC";
- Mangler.mangleNameOrStandardSubstitution(RD);
+ Mangler.mangleCXXRecordDecl(RD);
Mangler.getStream() << Offset;
Mangler.getStream() << '_';
- Mangler.mangleNameOrStandardSubstitution(Type);
+ Mangler.mangleCXXRecordDecl(Type);
}
void ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) {
diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp
index d0800af55c87e8..848b026028be76 100644
--- a/clang/test/CodeGenCXX/mangle.cpp
+++ b/clang/test/CodeGenCXX/mangle.cpp
@@ -11,6 +11,8 @@ struct Y { };
//CHECK: @pr5966_i = external global
//CHECK: @_ZL8pr5966_j = internal global
+//CHECK: @_ZTCN6test624InstE0_NS_1A4ImplINS1_4WrapEEE
+
// CHECK-LABEL: define{{.*}} zeroext i1 @_ZplRK1YRA100_P1X
bool operator+(const Y&, X* (&xs)[100]) { return false; }
@@ -1214,3 +1216,25 @@ namespace test61 {
// CHECK-LABEL: @_ZN6test611fINS_1XEEEvNT_1Y1aENS3_1bE
template void f<X>(int, int);
}
+
+namespace test62 {
+namespace A {
+
+class VBase {
+ public:
+ virtual ~VBase() {};
+};
+
+struct Wrap {};
+
+template <typename T>
+class Impl : public virtual VBase {
+ public:
+};
+
+} // namespace A
+
+struct Inst : public A::Impl<A::Wrap> {};
+
+void Test() { Inst a; }
+}
>From 9599a60133e2b32cd45c88c50c2d6dc6ebf601b8 Mon Sep 17 00:00:00 2001
From: tcwzxx <tcwzxx at gmail.com>
Date: Fri, 27 Sep 2024 14:17:27 +0800
Subject: [PATCH 2/5] move test case to mangle-subst.cpp
---
clang/test/CodeGenCXX/mangle-subst.cpp | 27 ++++++++++++++++++++++++++
clang/test/CodeGenCXX/mangle.cpp | 23 ----------------------
2 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/clang/test/CodeGenCXX/mangle-subst.cpp b/clang/test/CodeGenCXX/mangle-subst.cpp
index 20f33a72fff830..524e0febe479a8 100644
--- a/clang/test/CodeGenCXX/mangle-subst.cpp
+++ b/clang/test/CodeGenCXX/mangle-subst.cpp
@@ -1,4 +1,8 @@
// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -fclang-abi-compat=19 | FileCheck %s --check-prefix=CHECK-CLANG-19
+
+//CHECK: @_ZTCN16MangleCtorVTable4InstE0_NS_1A4ImplINS1_4WrapEEE
+//CHECK-CLANG-19: @_ZTCN16MangleCtorVTable4InstE0_NS_1A4ImplINS0_4WrapEEE
struct X {};
@@ -96,3 +100,26 @@ typename X<T>::template Y<T>::type f(typename X<T>::template Y<T>::type2) { retu
// CHECK: @_ZN12ManglePrefix1fIiEENS_1XIT_E1YIS2_E4typeENS5_5type2E
template int f<int>(int);
}
+
+namespace MangleCtorVTable {
+namespace A {
+
+class VBase {
+ public:
+ virtual ~VBase() {};
+};
+
+struct Wrap {};
+
+template <typename T>
+class Impl : public virtual VBase {
+ public:
+};
+
+} // namespace A
+
+struct Inst : public A::Impl<A::Wrap> {};
+
+void Test() { Inst a; }
+
+}
diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp
index 848b026028be76..7bf2b76ac6f611 100644
--- a/clang/test/CodeGenCXX/mangle.cpp
+++ b/clang/test/CodeGenCXX/mangle.cpp
@@ -11,7 +11,6 @@ struct Y { };
//CHECK: @pr5966_i = external global
//CHECK: @_ZL8pr5966_j = internal global
-//CHECK: @_ZTCN6test624InstE0_NS_1A4ImplINS1_4WrapEEE
// CHECK-LABEL: define{{.*}} zeroext i1 @_ZplRK1YRA100_P1X
bool operator+(const Y&, X* (&xs)[100]) { return false; }
@@ -1216,25 +1215,3 @@ namespace test61 {
// CHECK-LABEL: @_ZN6test611fINS_1XEEEvNT_1Y1aENS3_1bE
template void f<X>(int, int);
}
-
-namespace test62 {
-namespace A {
-
-class VBase {
- public:
- virtual ~VBase() {};
-};
-
-struct Wrap {};
-
-template <typename T>
-class Impl : public virtual VBase {
- public:
-};
-
-} // namespace A
-
-struct Inst : public A::Impl<A::Wrap> {};
-
-void Test() { Inst a; }
-}
>From f22800028b9c3703dbcf0a2cd6cad6485579b833 Mon Sep 17 00:00:00 2001
From: tcwzxx <tcwzxx at gmail.com>
Date: Fri, 27 Sep 2024 14:18:09 +0800
Subject: [PATCH 3/5] Add ABI version
---
clang/include/clang/Basic/LangOptions.h | 6 ++++++
clang/lib/AST/ItaniumMangle.cpp | 2 ++
clang/lib/Frontend/CompilerInvocation.cpp | 5 +++++
3 files changed, 13 insertions(+)
diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index 6c186c410e158d..83c38a63a34269 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -237,6 +237,12 @@ class LangOptionsBase {
/// in the initializers of members of local classes.
Ver18,
+ /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
+ /// This causes clang to:
+ /// - Incorrect Mangling of CXXCtorVTable
+ Ver19,
+
+
/// Conform to the underlying platform's C and C++ ABIs as closely
/// as we can.
Latest
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 2c3321ad564781..f043da23ff1680 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -3033,6 +3033,8 @@ void CXXNameMangler::mangleCXXRecordDecl(const CXXRecordDecl *Record) {
if (mangleSubstitution(Record))
return;
mangleName(Record);
+ if (isCompatibleWith(LangOptions::ClangABI::Ver19))
+ return;
addSubstitution(Record);
}
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index efd852593468aa..947a9ade824631 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3802,6 +3802,9 @@ void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts,
case LangOptions::ClangABI::Ver18:
GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "18.0");
break;
+ case LangOptions::ClangABI::Ver19:
+ GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "19.0");
+ break;
case LangOptions::ClangABI::Latest:
break;
}
@@ -4332,6 +4335,8 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
Opts.setClangABICompat(LangOptions::ClangABI::Ver17);
else if (Major <= 18)
Opts.setClangABICompat(LangOptions::ClangABI::Ver18);
+ else if (Major <= 19)
+ Opts.setClangABICompat(LangOptions::ClangABI::Ver19);
} else if (Ver != "latest") {
Diags.Report(diag::err_drv_invalid_value)
<< A->getAsString(Args) << A->getValue();
>From b2c397bd45f690394e55e889f11080c0b718eb5d Mon Sep 17 00:00:00 2001
From: tcwzxx <tcwzxx at gmail.com>
Date: Fri, 27 Sep 2024 14:30:18 +0800
Subject: [PATCH 4/5] Add release note
---
clang/docs/ReleaseNotes.rst | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 5923888383022a..9b2ef7e4fe380f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -85,6 +85,7 @@ ABI Changes in This Version
---------------------------
- Fixed Microsoft name mangling of placeholder, auto and decltype(auto), return types for MSVC 1920+. This change resolves incompatibilities with code compiled by MSVC 1920+ but will introduce incompatibilities with code compiled by earlier versions of Clang unless such code is built with the compiler option -fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
+- Fix the Itanium mangling of CXXCtorVTable (#GH108015).
AST Dumping Potentially Breaking Changes
----------------------------------------
>From 3c40e377f3e75901f097dd652d6f94c0bdbcf087 Mon Sep 17 00:00:00 2001
From: tcwzxx <tcwzxx at gmail.com>
Date: Fri, 27 Sep 2024 15:17:08 +0800
Subject: [PATCH 5/5] fix format
---
clang/include/clang/Basic/LangOptions.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index 83c38a63a34269..80cb2dba6c5162 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -242,7 +242,6 @@ class LangOptionsBase {
/// - Incorrect Mangling of CXXCtorVTable
Ver19,
-
/// Conform to the underlying platform's C and C++ ABIs as closely
/// as we can.
Latest
More information about the cfe-commits
mailing list