On Mon, Mar 25, 2013 at 6:25 PM, Reid Kleckner <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
