zahiraam added a comment.

In D117569#3262595 <https://reviews.llvm.org/D117569#3262595>, @zahiraam wrote:

> @majnemer
>
> I did take an example completely different with no use of the constexpr in 
> order to understand (at least for me) when the _imp prefix is generated with 
> CL.
> This is sample.cpp:
> #include<iostream>
>
> __declspec(dllexport) void PrintHello()
> {
>
>   std::cout << "hello" << std::endl;
>
> }
>
> $ cl  sample.cpp /LD /EHsc
> Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27045 for x64
> Copyright (C) Microsoft Corporation.  All rights reserved.
>
> sample.cpp
> Microsoft (R) Incremental Linker Version 14.16.27045.0
> Copyright (C) Microsoft Corporation.  All rights reserved.
>
> /out:sample.dll
> /dll
> /implib:sample.lib
> sample.obj
>
>   Creating library sample.lib and object sample.exp
>
> $
> This is testapp.cpp:
> extern void __declspec(dllimport)PrintHello();
>
> void main()
> {
>
>   PrintHello();
>
> }
>
> $ cl  testapp.cpp /EHsc /link sample.lib
> Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27045 for x64
> Copyright (C) Microsoft Corporation.  All rights reserved.
>
> testapp.cpp
> Microsoft (R) Incremental Linker Version 14.16.27045.0
> Copyright (C) Microsoft Corporation.  All rights reserved.
>
> /out:testapp.exe
> sample.lib
> testapp.obj
> $
> $ dumpbin /symbols testapp.obj | grep imp
> 008 00000000 UNDEF  notype       External     | __imp_?PrintHello@@YAXXZ 
> (__declspec(dllimport) void __cdecl PrintHello(void))
> $
>
> My understanding that the _imp prefix is generated because of the dllimport 
> in testapp.cpp.
> So if we go back to the test case above:
>
> extern int __declspec(dllimport) dll_import_int;
> constexpr int& dll_import_constexpr_ref = dll_import_int;
> int& get() {
>
>   return dll_import_constexpr_ref;
>
> }
> int main () {
>
>   get();
>   return 0;
>
> }
>
> CLANG (with this patch and ICL for that matter) generates the symbol:
>
> 011 00000000 UNDEF  notype       External     | __imp_?dll_import_int@@3HA 
> (__declspec(dllimport) int dll_import_int)
>
> but not MSVC. This seems incorrect to me since the _imp prefix is always 
> generated for dllimport symbols?

OTOH it does seem odd that clang is generating for the test case 2 UNDEF 
symbols. One with the _imp mangling and one without?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D117569/new/

https://reviews.llvm.org/D117569

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to