Hi,

today we got a report on the cygwin-developers mailing list, which
reported that linking a certain library fails, because some of the
inline functions in winnt.h can't be resolved by the linker under
Cygwin:

  http://cygwin.com/ml/cygwin-developers/2013-04/msg00010.html

The problem here is that the intrinsics are linked into libmingwex.a,
but libmingwex.a doesn't exist in the w32api and thuis isn't available
under Cygwin.

Kai and I discussed this privatly on IRC and we came to the conclusion
that the most generic solution is to include the intrinsics in
libkernel32.a, rather than in libmingwex.a.  This allows to link against
the intrinsics on both platforms, Mingw-w64 as well as Cygwin.  

It also matches the expectations of application programmers when reading
MSDN.  Apart from the fact that the functions are implemented as
compiler intrinsics, their documentation on MSDN claims their
availability in kernel32.lib, see, for instance,
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683597%28v=vs.85%29.aspx,
in the "Requirements" section.

The below patch implements this.  It strips the intrinsic functions
from the src_libmingwex variable and introduces a src_intrincs
variable instead.  It also renames src_libmingwex32 and src_libmingwex64
to src_intrincs32 and src_intrincs64.  Then it adds rules for building
libkernel32.a for 32 and 64 bit targets, and includes the intrinsics
functions to their sources.

Is that ok to check in?


Thanks,
Corinna


        * Makefile.am (src_libmingwex): Split off intrinsic functions
        into...
        (src_intrincs): ...this new variable.
        (src_intrincs64): Rename from src_libmingwex64.
        (src_intrincs32): Rename from src_libmingwex32.
        (lib32_LIBRARIES): Add lib32/libkernel32.a.
        (lib32_libkernel32_a_SOURCES): New variable.
        (lib32_libkernel32_a_CPPFLAGS): New variable.
        (lib32_DATA): Remove lib32/libkernel32.a.
        (lib64_LIBRARIES): Add lib64/libkernel32.a.
        (lib64_libkernel32_a_SOURCES): New variable.
        (lib64_libkernel32_a_CPPFLAGS): New variable.
        (lib64_DATA): Remove lib64/libkernel32.a.


Index: Makefile.am
===================================================================
--- Makefile.am (revision 5712)
+++ Makefile.am (working copy)
@@ -217,21 +217,6 @@
   stdio/vscanf.c           stdio/vsnprintf.c         stdio/vsnprintf_s.c      
stdio/vsnwprintf.c        stdio/vsscanf.c         \
   stdio/vswscanf.c         stdio/vwscanf.c           stdio/wtoll.c            \
   \
-  intrincs/__movsb.c        intrincs/__movsd.c        intrincs/__movsw.c       
  intrincs/__stosb.c       intrincs/__stosd.c        \
-  intrincs/__stosw.c        intrincs/_rotl64.c        intrincs/_rotr64.c       
  intrincs/bitscanfwd.c    intrincs/bitscanrev.c     \
-  intrincs/bittest.c        intrincs/bittestc.c       intrincs/bittestci.c     
  intrincs/bittestr.c      intrincs/bittestri.c      \
-  intrincs/bittests.c       intrincs/bittestsi.c      intrincs/cpuid.c         
  intrincs/currentfiber.c  intrincs/currentteb.c     \
-  intrincs/fiberdata.c      intrincs/ilockadd.c       intrincs/ilockand.c      
  intrincs/ilockand64.c    intrincs/ilockcxch.c      \
-  intrincs/ilockcxch16.c    intrincs/ilockcxch64.c    intrincs/ilockcxchptr.c  
  intrincs/ilockdec.c      intrincs/ilockdec16.c     \
-  intrincs/ilockdec64.c     intrincs/ilockexch.c      intrincs/ilockexch64.c   
  intrincs/ilockexchadd.c  intrincs/ilockexchadd64.c \
-  intrincs/ilockexchptr.c   intrincs/ilockinc.c       intrincs/ilockinc16.c    
  intrincs/ilockinc64.c    intrincs/ilockor.c        \
-  intrincs/ilockor64.c      intrincs/ilockxor.c       intrincs/ilockxor64.c    
  intrincs/inbyte.c        intrincs/inbytestring.c   \
-  intrincs/indword.c        intrincs/indwordstring.c  intrincs/inword.c        
  intrincs/inwordstring.c  intrincs/outbyte.c        \
-  intrincs/outbytestring.c  intrincs/outdword.c       
intrincs/outdwordstring.c  intrincs/outword.c       intrincs/outwordstring.c  \
-  intrincs/rdtsc.c          intrincs/readcr0.c        intrincs/readcr2.c       
  intrincs/readcr3.c       intrincs/readcr4.c        \
-  intrincs/readcr8.c        intrincs/readmsr.c        intrincs/writecr0.c      
  intrincs/writecr2.c      intrincs/writecr3.c       \
-  intrincs/writecr4.c       intrincs/writecr8.c       intrincs/writemsr.c      
  intrincs/RtlSecureZeroMemory.c \
-  \
   secapi/_cgets_s.c secapi/_cgetws_s.c \
   secapi/_cprintf_s.c secapi/_cprintf_s_l.c \
   secapi/_vcprintf_s.c secapi/_vcprintf_s_l.c \
@@ -249,8 +234,25 @@
   secapi/_strtime_s.c secapi/_wstrtime_s.c \
   secapi/wmemcpy_s.c secapi/memcpy_s.c
 
+# These intrinsics are target independent:
+src_intrincs= \
+  intrincs/__movsb.c        intrincs/__movsd.c        intrincs/__movsw.c       
  intrincs/__stosb.c       intrincs/__stosd.c        \
+  intrincs/__stosw.c        intrincs/_rotl64.c        intrincs/_rotr64.c       
  intrincs/bitscanfwd.c    intrincs/bitscanrev.c     \
+  intrincs/bittest.c        intrincs/bittestc.c       intrincs/bittestci.c     
  intrincs/bittestr.c      intrincs/bittestri.c      \
+  intrincs/bittests.c       intrincs/bittestsi.c      intrincs/cpuid.c         
  intrincs/currentfiber.c  intrincs/currentteb.c     \
+  intrincs/fiberdata.c      intrincs/ilockadd.c       intrincs/ilockand.c      
  intrincs/ilockand64.c    intrincs/ilockcxch.c      \
+  intrincs/ilockcxch16.c    intrincs/ilockcxch64.c    intrincs/ilockcxchptr.c  
  intrincs/ilockdec.c      intrincs/ilockdec16.c     \
+  intrincs/ilockdec64.c     intrincs/ilockexch.c      intrincs/ilockexch64.c   
  intrincs/ilockexchadd.c  intrincs/ilockexchadd64.c \
+  intrincs/ilockexchptr.c   intrincs/ilockinc.c       intrincs/ilockinc16.c    
  intrincs/ilockinc64.c    intrincs/ilockor.c        \
+  intrincs/ilockor64.c      intrincs/ilockxor.c       intrincs/ilockxor64.c    
  intrincs/inbyte.c        intrincs/inbytestring.c   \
+  intrincs/indword.c        intrincs/indwordstring.c  intrincs/inword.c        
  intrincs/inwordstring.c  intrincs/outbyte.c        \
+  intrincs/outbytestring.c  intrincs/outdword.c       
intrincs/outdwordstring.c  intrincs/outword.c       intrincs/outwordstring.c  \
+  intrincs/rdtsc.c          intrincs/readcr0.c        intrincs/readcr2.c       
  intrincs/readcr3.c       intrincs/readcr4.c        \
+  intrincs/readcr8.c        intrincs/readmsr.c        intrincs/writecr0.c      
  intrincs/writecr2.c      intrincs/writecr3.c       \
+  intrincs/writecr4.c       intrincs/writecr8.c       intrincs/writemsr.c      
  intrincs/RtlSecureZeroMemory.c
+
 # these only go into the 64 bit version:
-src_libmingwex64=\
+src_intrincs64=\
   intrincs/bittest64.c    intrincs/bittestc64.c   intrincs/bittestr64.c   
intrincs/bittestri64.c     \
   intrincs/bittests64.c   intrincs/bittestsi64.c  intrincs/bitscanfwd64.c 
intrincs/bitscanrev64.c    \
   intrincs/ilockadd64.c   intrincs/readgsbyte.c   intrincs/readgsword.c   
intrincs/readgsdword.c     \
@@ -260,7 +262,7 @@
   intrincs/__shiftleft128.c
 
 # these only go into the 32 bit version:
-src_libmingwex32=\
+src_intrincs32=\
   intrincs/membarrier.c   intrincs/readfsbyte.c   intrincs/readfsword.c   
intrincs/readfsdword.c  \
   intrincs/writefsbyte.c  intrincs/writefsword.c  intrincs/writefsdword.c
 
@@ -313,7 +315,11 @@
 dxerr.c \
 test.c
 
-lib32_LIBRARIES = lib32/libshell32.a
+lib32_LIBRARIES = lib32/libkernel32.a
+lib32_libkernel32_a_SOURCES = $(src_intrincs) $(src_intrincs32)
+lib32_libkernel32_a_CPPFLAGS=$(CPPFLAGS32) $(extra_include) $(AM_CPPFLAGS)
+
+lib32_LIBRARIES += lib32/libshell32.a
 lib32_libshell32_a_SOURCES = $(src_libshell32)
 lib32_libshell32_a_AR = $(DTLIB32) && $(AR) $(ARFLAGS)
 lib32_libshell32_a_CPPFLAGS=$(CPPFLAGS32) $(sysincludes)
@@ -429,7 +435,7 @@
 
 lib32_LIBRARIES += lib32/libmingwex.a
 lib32_libmingwex_a_CPPFLAGS=$(CPPFLAGS32) $(extra_include) $(AM_CPPFLAGS)
-lib32_libmingwex_a_SOURCES = $(src_libmingwex) $(src_libmingwex32)
+lib32_libmingwex_a_SOURCES = $(src_libmingwex)
 
 lib32_LIBRARIES += lib32/libmoldname.a
 lib32_libmoldname_a_CPPFLAGS=$(CPPFLAGS32) $(extra_include) $(AM_CPPFLAGS)
@@ -456,7 +462,7 @@
   lib32/libdxapi.a     lib32/libfaultrep.a  lib32/libgdi32.a     
lib32/libglaux.a     lib32/libglu32.a    \
   lib32/libglut32.a    lib32/libhal.a       lib32/libhid.a       
lib32/libhidclass.a \
   lib32/libhidparse.a  lib32/libicmui.a     lib32/libigmpagnt.a  
lib32/libimagehlp.a  lib32/libimm32.a    \
-  lib32/libiphlpapi.a  lib32/libkernel32.a  lib32/libksproxy.a   
lib32/libclfsw32.a   lib32/liblz32.a     \
+  lib32/libiphlpapi.a  lib32/libksproxy.a   lib32/libclfsw32.a   
lib32/liblz32.a     \
   lib32/libmapi32.a    lib32/libmcd.a       lib32/libmfcuia32.a  
lib32/libmgmtapi.a   lib32/libmprapi.a   \
   lib32/libmpr.a       lib32/libmqrt.a      lib32/libmsacm32.a   
lib32/libmscms.a     lib32/libmsdmo.a    \
   lib32/libmsi.a       \
@@ -625,7 +631,11 @@
 lib64/%.o: crt/%.c
        $(COMPILE) $(CPPFLAGS64) -c $< -o $@
 
-lib64_LIBRARIES = lib64/libshell32.a
+lib64_LIBRARIES = lib64/libkernel32.a
+lib64_libkernel32_a_SOURCES = $(src_intrincs) $(src_intrincs64)
+lib64_libkernel32_a_CPPFLAGS=$(CPPFLAGS64) -D_SYSCRT=1 -DCRTDLL=1 
$(extra_include) $(AM_CPPFLAGS)
+
+lib64_LIBRARIES += lib64/libshell32.a
 lib64_libshell32_a_SOURCES = $(src_libshell32)
 lib64_libshell32_a_CPPFLAGS=$(CPPFLAGS64) $(sysincludes)
 lib64_libshell32_a_AR = $(DTLIB64) && $(AR) $(ARFLAGS)
@@ -741,7 +751,7 @@
 
 lib64_LIBRARIES += lib64/libmingwex.a
 lib64_libmingwex_a_CPPFLAGS=$(CPPFLAGS64) $(extra_include) $(AM_CPPFLAGS)
-lib64_libmingwex_a_SOURCES = $(src_libmingwex) $(src_libmingwex64)
+lib64_libmingwex_a_SOURCES = $(src_libmingwex)
 
 lib64_LIBRARIES += lib64/libmoldname.a
 lib64_libmoldname_a_CPPFLAGS=$(CPPFLAGS64) $(extra_include) $(AM_CPPFLAGS)
@@ -978,7 +988,7 @@
   lib64/libwshcon.a     lib64/libwsock32.a    lib64/libzoneoc.a       
lib64/libnormaliz.a   \
   \
   lib64/libclfsw32.a    \
-  lib64/libkernel32.a   lib64/libdwmapi.a     lib64/libntoskrnl.a     
lib64/libuxtheme.a    \
+  lib64/libdwmapi.a     lib64/libntoskrnl.a     lib64/libuxtheme.a    \
   lib64/libwtsapi32.a   \
   \
   lib64/libcrtdll.a     lib64/libmsvcrt.a     lib64/libmsvcr80.a     \

------------------------------------------------------------------------------
Own the Future-Intel(R) Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest. Compete 
for recognition, cash, and the chance to get your game on Steam. 
$5K grand prize plus 10 genre and skill prizes. Submit your demo 
by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to