[llvm-bugs] [Bug 37276] New: Importing symbols with __m128 type from MSVC .lib fails
via llvm-bugs
llvm-bugs at lists.llvm.org
Fri Apr 27 14:11:26 PDT 2018
https://bugs.llvm.org/show_bug.cgi?id=37276
Bug ID: 37276
Summary: Importing symbols with __m128 type from MSVC .lib
fails
Product: lld
Version: unspecified
Hardware: PC
OS: Windows NT
Status: NEW
Severity: normal
Priority: P
Component: COFF
Assignee: unassignedbugs at nondot.org
Reporter: alexandre.ganea at ubisoft.com
CC: llvm-bugs at lists.llvm.org
I'm trying to link against an external .lib that we have no control upon. The
library was compiled with MSVC. It contains functions using __m128. Our code
builds with clang-cl.
When the external library is linked in, functions using __m128 types fail to
resolve, even if they are there.
Given that __m128 is a built-in in clang, mangled symbols are generated (a bit)
differently than when compiling with MSVC.
Consider the following:
// =========================== lib.cpp
#include <intrin.h>
__declspec(dllexport) __m128 identity(const __m128& in)
{
__m128 a = _mm_set_ps1(1.0f);
return a;
}
// =========================== use_lib.cpp
#include <intrin.h>
#include <cstdio>
__declspec(dllimport) __m128 identity(const __m128& in);
int main()
{
__m128 in;
__m128 a = identity(in);
printf("%f\n", (float&)a);
return 0;
}
rem ================================= __build_msvc.bat
del *.dll *.exp *.lib *.exe *.obj
cl /c lib.cpp
lld-link lib.obj /dll
cl /c use_lib.cpp
lld-link /out:good.exe lib.lib use_lib.obj
rem ================================= __build_clang.bat
del *.dll *.exp *.lib *.exe *.obj
cl /c lib.cpp
lld-link lib.obj /dll
clang-cl /c use_lib.cpp
lld-link /out:fail.exe lib.lib use_lib.obj
The script __build_clang.bat above fails with:
C:\Program Files (x86)\LLVM\bin\lld-link.exe: error: undefined symbol:
__imp_?identity@@YAT__m128@@AEBT1@@Z
>>> referenced by use_lib.obj:(main)
The difference is that the clang-generated symbol is:
?identity@@YA?AT__m128@@AEBT1@@Z
While the MSVC-generated symbol is:
?identity@@YAT__m128@@AEBT1@@Z
Using http://demangler.com/ or the UnDecorateSymbolName API, both resolve to
exactly the same thing:
union __m128 __cdecl identity(union __m128 const & __ptr64)
This issue seems to be caused by a side-effect in
MicrosoftCXXNameMangler::mangleType(),
https://github.com/llvm-mirror/clang/blob/928958d3756d7bc74399bb9d6489bb7b7361398a/lib/AST/MicrosoftMangle.cpp#L1752
- I expect T (__m128) is probably not a TagType thus ?A is not generated.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20180427/93ad8556/attachment.html>
More information about the llvm-bugs
mailing list