[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