[PATCH] [ms-cxxabi] Mangle vector types
Richard Smith
richard at metafoo.co.uk
Mon Mar 25 19:09:00 PDT 2013
On Mon, Mar 25, 2013 at 6:25 PM, Reid Kleckner <rnk at google.com> wrote:
> Hi rjmccall,
>
> The only vector types a user can pass from MSVC code to clang code are
> the ones from *mmintrin.h, so we only have to match the MSVC mangling
> for these types. MSVC mangles the __m128 family of types as tag types,
> which we match. For other vector types, we emit a unique tag type
> mangling that won't match anything produced by MSVC.
>
> http://llvm-reviews.chandlerc.com/D576
>
> Files:
> lib/AST/MicrosoftMangle.cpp
> test/CodeGenCXX/mangle-ms-vector-types.cpp
>
> Index: lib/AST/MicrosoftMangle.cpp
> ===================================================================
> --- lib/AST/MicrosoftMangle.cpp
> +++ lib/AST/MicrosoftMangle.cpp
> @@ -1519,12 +1519,45 @@
>
> void MicrosoftCXXNameMangler::mangleType(const VectorType *T,
> SourceRange Range) {
> - DiagnosticsEngine &Diags = Context.getDiags();
> - unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
> - "cannot mangle this vector type yet");
> - Diags.Report(Range.getBegin(), DiagID)
> - << Range;
> + if (!T->getElementType()->isBuiltinType()) {
> + DiagnosticsEngine &Diags = Context.getDiags();
> + unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
> + "cannot mangle vectors of non-builtin types");
> + Diags.Report(Range.getBegin(), DiagID)
> + << Range;
> + }
> +
> + const BuiltinType *ET = T->getElementType()->getAs<BuiltinType>();
> + 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 IntelVector = true;
> + if (Width == 64 && ET->getKind() == BuiltinType::LongLong) {
> + Out << "T__m64";
> + } else if (Width == 128 || Width == 256) {
> + if (ET->getKind() == BuiltinType::Float)
> + Out << "T__m" << Width;
> + else if (ET->getKind() == BuiltinType::LongLong)
> + Out << "T__m" << Width << 'i';
> + else if (ET->getKind() == BuiltinType::Double)
> + Out << "U__m" << Width << 'd';
> + else
> + IntelVector = false; // Has to be float.
>
This comment seems misleading: 'long long' isn't a floating-point type.
> + } else {
> + IntelVector = false;
> + }
> +
> + if (!IntelVector) {
> + // 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, Range);
> + }
> +
> + Out << "@@";
> }
> +
> void MicrosoftCXXNameMangler::mangleType(const ExtVectorType *T,
> SourceRange Range) {
> DiagnosticsEngine &Diags = Context.getDiags();
> Index: test/CodeGenCXX/mangle-ms-vector-types.cpp
> ===================================================================
> --- /dev/null
> +++ test/CodeGenCXX/mangle-ms-vector-types.cpp
> @@ -0,0 +1,30 @@
> +// RUN: %clang_cc1 -fms-extensions -ffreestanding -target-feature +avx
> -emit-llvm %s -o - -cxx-abi microsoft -triple=i686-pc-win32 | FileCheck %s
> +
> +#include <xmmintrin.h>
> +#include <emmintrin.h>
> +#include <immintrin.h>
> +
> +void foo64(__m64) {}
> +// CHECK: define void @"\01?foo64@@YAXT__m64@@@Z"
> +
> +void foo128(__m128) {}
> +// CHECK: define void @"\01?foo128@@YAXT__m128@@@Z"
> +
> +void foo128d(__m128d) {}
> +// CHECK: define void @"\01?foo128d@@YAXU__m128d@@@Z"
> +
> +void foo128i(__m128i) {}
> +// CHECK: define void @"\01?foo128i@@YAXT__m128i@@@Z"
> +
> +void foo256(__m256) {}
> +// CHECK: define void @"\01?foo256@@YAXT__m256@@@Z"
> +
> +void foo256d(__m256d) {}
> +// CHECK: define void @"\01?foo256d@@YAXU__m256d@@@Z"
> +
> +void foo256i(__m256i) {}
> +// CHECK: define void @"\01?foo256i@@YAXT__m256i@@@Z"
> +
> +// 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"
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130325/de12a568/attachment.html>
More information about the cfe-commits
mailing list