zahiraam added a comment.

In D117569#3259255 <https://reviews.llvm.org/D117569#3259255>, @majnemer wrote:

> 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?

This is what I did (before the complete experiment). 
For this test case:

int& get() {

  extern int __declspec(dllimport) dll_import_int;
  constexpr int& dll_import_constexpr_ref = dll_import_int;
  
  return dll_import_constexpr_ref;

}

int main() {

  get();
  
  return 0;

}
This is generating this symbol (with imp):
ksh-3.2$ dumpbin /symbols test2.obj  | grep dll
015 00000000 UNDEF  notype       External     | **__imp**_?dll_import_int@@3HA 
(__declspec(dllimport) int dll_import_int)
ksh-3.2$

With clang (with this patch) it is generating the same symbol:
ksh-3.2$ dumpbin /symbols test2.o  | grep dll
00E 00000000 UNDEF  notype       External     | __imp_?dll_import_int@@3HA 
(__declspec(dllimport) int dll_import_int)
ksh-3.2$

For this test case:
extern int __declspec(dllexport) dll_export_int;
constexpr int& dll_export_constexpr_ref = dll_export_int;

int& get() {

  extern int __declspec(dllimport) dll_import_int;
  constexpr int& dll_import_constexpr_ref = dll_import_int;
  return dll_export_constexpr_ref;

}

int main() {

  get();
  
  return 0;

}

MSVC is generating these symbols:
ksh-3.2$ dumpbin /symbols test3.obj  | grep dll
007 00000000 UNDEF  notype       External     | ?dll_export_int@@3HA (int 
dll_export_int)
018 00000000 SECT6  notype       Static       | 
?dll_export_constexpr_ref@@3AEAHEA (int & dll_export_constexpr_ref)
019 00000000 UNDEF  notype       External     | __imp_?dll_import_int@@3HA 
(__declspec(dllimport) int dll_import_int)
ksh-3.2$

clang (with this patch) is generating an error:
test3.cpp:2:16: error: constexpr variable 'dll_export_constexpr_ref' must be

  initialized by a constant expression

constexpr int& dll_export_constexpr_ref = dll_export_int;

  ^                          ~~~~~~~~~~~~~~

1 error generated.

Your thoughts?


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