majnemer added a comment.

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

> In D117569#3257121 <https://reviews.llvm.org/D117569#3257121>, @majnemer 
> wrote:
>
>> I have a question regarding how this work with respect to the dllimport 
>> semantics known by the linker.
>> IIUC, we will now allow a program like:
>>
>>   extern int __declspec(dllimport) dll_import_int;
>>   constexpr int& dll_import_constexpr_ref = dll_import_int;
>>   int& get() {
>>       return dll_import_constexpr_ref;
>>   }
>>
>> Here, `get` will load `dll_import_constexpr_ref`. However, what will 
>> `dll_import_constexpr_ref` hold? It ought to hold the contents of 
>> `__imp_?dll_import_int@@3HA`. However, we can't dereference 
>> `__imp_?dll_import_int@@3HA` to get to its contents.
>
> @majnemer Thanks for the review.
>
> This test case doesn't link with MSVC. It will generate this error:
> Microsoft (R) Incremental Linker Version 14.29.30133.0
> Copyright (C) Microsoft Corporation.  All rights reserved.
>
> /out:test1.exe
> test1.obj
> test1.obj : error LNK2001: unresolved external symbol "int dll_import_int" 
> (?dll_import_int@@3HA)
> test1.exe : fatal error LNK1120: 1 unresolved externals
>
> The symbols generated with MSVC are:
> 07 00000000 UNDEF  notype       External     | ?dll_import_int@@3HA (int 
> dll_import_int)
> 015 00000000 SECT6  notype       Static       | 
> ?dll_import_constexpr_ref@@3AEAHEA (int & dll_import_constexpr_ref)
>
> Without this patch this test case errors. With this patch clang will generate 
> these symbols:
>
> 010 00000000 UNDEF  notype       External     | __imp_?dll_import_int@@3HA 
> (__declspec(dllimport) int dll_import_int)
> 012 00000000 SECT5  notype       External     | 
> ?dll_import_constexpr_ref@@3AEAHEA (int & dll_import_constexpr_ref)
> 013 00000000 UNDEF  notype       External     | ?dll_import_int@@3HA (int 
> dll_import_int)
>
> and will error at link time with this error:
> test1-f1f63b.o : error LNK2019: unresolved external symbol 
> "__declspec(dllimport) int dll_import_int" (__imp_?dll_import_int@@3HA) 
> referenced in function "int & __cdecl get(void)" (?get@@YAAEAHXZ)
> test1-f1f63b.o : error LNK2001: unresolved external symbol "int 
> dll_import_int" (?dll_import_int@@3HA)
> a.exe : fatal error LNK1120: 2 unresolved externals
>
> I think that's the behavior expected, right?

My interpretation is that MSVC has a bug: it is forming a reference to 
`?dll_import_int@@3HA` and not `__imp_?dll_import_int@@3HA`. Could you run a 
more complete experiment where you have a dll which exports the symbol and you 
try to import it?


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