From 0a29fed31f05fdcaa8bfe95ae11ead8e5513ee81 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 29 Dec 2015 11:45:58 +0000 Subject: [PATCH] [MS ABI] Cleanup our mangling of vector types We used to produce a type which demangled to: union __clang_vec8_F That 'F' is the mangling for 'short' but it is present in the mangled name in an inappropriate place, leading to it not getting demangled. Instead, create a synthetic class type in a synthetic namespace called __clang. With this, it now demangles to: union __clang::__vector llvm-svn: 256556 --- clang/lib/AST/MicrosoftMangle.cpp | 23 +++++++++++-------- .../CodeGenCXX/mangle-ms-vector-types.cpp | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 9b1bdfa7f902..e4b043939fcc 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -2227,7 +2227,7 @@ void MicrosoftCXXNameMangler::mangleType(const VectorType *T, Qualifiers Quals, uint64_t Width = getASTContext().getTypeSize(T); // Pattern match exactly the typedefs in our intrinsic headers. Anything that // doesn't match the Intel types uses a custom mangling below. - bool IsBuiltin = true; + size_t OutSizeBefore = Out.tell(); llvm::Triple::ArchType AT = getASTContext().getTargetInfo().getTriple().getArch(); if (AT == llvm::Triple::x86 || AT == llvm::Triple::x86_64) { @@ -2240,22 +2240,25 @@ void MicrosoftCXXNameMangler::mangleType(const VectorType *T, Qualifiers Quals, mangleArtificalTagType(TTK_Union, "__m" + llvm::utostr(Width) + 'i'); else if (ET->getKind() == BuiltinType::Double) mangleArtificalTagType(TTK_Struct, "__m" + llvm::utostr(Width) + 'd'); - else - IsBuiltin = false; - } else { - IsBuiltin = false; } - } else { - IsBuiltin = false; } + bool IsBuiltin = Out.tell() != OutSizeBefore; if (!IsBuiltin) { // The MS ABI doesn't have a special mangling for vector types, so we define // our own mangling to handle uses of __vector_size__ on user-specified // types, and for extensions like __v4sf. - Out << "T__clang_vec" << T->getNumElements() << '_'; - mangleType(ET, Quals, Range); - Out << "@@"; + + llvm::SmallString<64> TemplateMangling; + llvm::raw_svector_ostream Stream(TemplateMangling); + MicrosoftCXXNameMangler Extra(Context, Stream); + Stream << "?$"; + Extra.mangleSourceName("__vector"); + Extra.mangleType(QualType(ET, 0), Range, QMM_Escape); + Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(T->getNumElements()), + /*IsBoolean=*/false); + + mangleArtificalTagType(TTK_Union, TemplateMangling, {"__clang"}); } } diff --git a/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp b/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp index 5aca4551cebc..53a1a43fe4af 100644 --- a/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp +++ b/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp @@ -27,11 +27,11 @@ void foo256i(__m256i) {} // We have a custom mangling for vector types not standardized by Intel. void foov8hi(__v8hi) {} -// CHECK: define void @"\01?foov8hi@@YAXT__clang_vec8_F@@@Z" +// CHECK: define void @"\01?foov8hi@@YAXT?$__vector@F$07@__clang@@@Z" typedef __attribute__((ext_vector_type(4))) int vi4b; void foovi4b(vi4b) {} -// CHECK: define void @"\01?foovi4b@@YAXT__clang_vec4_H@@@Z" +// CHECK: define void @"\01?foovi4b@@YAXT?$__vector@H$03@__clang@@@Z" // Clang does not support vectors of complex types, so we can't test the // mangling of them.