This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

DLL function importing "bugs"?


Hi,
I found out some small bugs when function is imported from DLL

Test library:
--------------------------------------------------------------------------------
#include <Windows.h>

__declspec(dllexport)
bool test() {
    return true;
}

extern "C"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    return TRUE;
}
--------------------------------------------------------------------------------
Build with:
  g++ -shared -o dlltest.dll dlltest.cpp -Wl,--out-implib,libdlltest.a -O3 \
  -flto -s
And small test program:
--------------------------------------------------------------------------------
#ifdef USE_DLL_IMPORT
__declspec(dllimport)
#endif
bool test();

int main() {
    return test() ? 0 : -1;
}
--------------------------------------------------------------------------------
Build with:
g++ apptest.cpp -o apptest1.exe -O3 -flto -ldlltest -L. -s
g++ apptest.cpp -o apptest2.exe -O3 -flto dlltest.dll -s
g++ apptest.cpp -o apptest3.exe -O3 -flto -ldlltest -L. -DUSE_DLL_IMPORT -s

And now, generated code for calling `test()` function:

For apptest1, apptest2:
  in main:     call    _Z4testv
  in _Z4testv: jmp     cs:__imp__Z4testv
For apptest3:
  in main:        call    cs:_Z4testv
  not-referenced: jmp     cs:_Z4testv
================================================================================
Some other test for __builtin functions that full versions are in MSVCRT.dll:
--------------------------------------------------------------------------------
__declspec(dllimport)
void * memcpy(void * destination, const void * source, size_t num);

void * memcpy_wrapper(size_t num, void * destination, const void * source) {
    return memcpy_wrapper(destination, source, num);
}
--------------------------------------------------------------------------------
In this case memcpy_wrapper uses wrapper (as apptest1 and apptest2 above) for
calling memcpy from MSVCRT.dll. I don't really know if this is a gcc or mingw
problem.
================================================================================
1. LTO should find out that `test()` function is really DLL function and do not
   use wrapper.
2. Optimizer should know that wrapper isn't referenced and remove it.
3. Wrappers shouldn't be used for builtin functions.

I'm not experienced enough to even build gcc by myself so I have no idea how to
fix it. I hope that someone smarter will do this (or tell me if it is
impossible).
================================================================================
I'm using: g++.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 6.3.0

Sorry for my English, but I'm still learning :)
Regards, Karol Rudnik.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]