]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0630: MS-Windows: build fails with VIMDLL and mzscheme v9.1.0630
authorKen Takata <kentkt@csc.jp>
Sat, 27 Jul 2024 11:25:34 +0000 (13:25 +0200)
committerChristian Brabandt <cb@256bit.org>
Sat, 27 Jul 2024 11:25:34 +0000 (13:25 +0200)
Problem:  MS-Windows: build fails with VIMDLL and mzscheme
Solution: define scheme_register_tls_space() inside gvim.exe
          and refer to it from the dll (Ken Takata).

`scheme_register_tls_space()` doesn't support a thread-local variable in
a DLL:
https://docs.racket-lang.org/inside/im_memoryalloc.html#%28cpp._scheme_register_tls_space%29

closes: #15363

Signed-off-by: Ken Takata <kentkt@csc.jp>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/Make_cyg_ming.mak
src/Make_mvc.mak
src/if_mzsch.c
src/os_w32exe.c
src/version.c

index f082c960d82d6c0cd34a2fd822db7f575743b2da..7c324fb64f7720c76d4e2520bab9a5b5282f5934 100644 (file)
@@ -1006,7 +1006,7 @@ EXELFLAGS += -s
  endif
  ifeq ($(COVERAGE),yes)
 EXELFLAGS += --coverage
- else
+ else ifndef MZSCHEME
 EXELFLAGS += -nostdlib
 EXECFLAGS = -DUSE_OWNSTARTUP
  endif
@@ -1141,12 +1141,14 @@ $(EXEOBJC): | $(OUTDIR)
 
 ifeq ($(VIMDLL),yes)
  ifneq ($(COVERAGE),yes)
-  ifeq ($(ARCH),x86-64)
+  ifndef MZSCHEME
+   ifeq ($(ARCH),x86-64)
 EXEENTRYC = -Wl,--entry=wmainCRTStartup
 EXEENTRYG = -Wl,--entry=wWinMainCRTStartup
-  else ifeq ($(ARCH),i686)
+   else ifeq ($(ARCH),i686)
 EXEENTRYC = -Wl,--entry=_wmainCRTStartup
 EXEENTRYG = -Wl,--entry=_wWinMainCRTStartup@0
+   endif
   endif
  endif
 
index c750311d22247acb56cf08d82bdddb5de5cd4035..3454a20fcbc72925142bb9bc3eca7343fa6c5b0b 100644 (file)
@@ -801,6 +801,13 @@ OBJ = $(OBJ) $(OUTDIR)\os_w32dll.obj $(OUTDIR)\vimd.res
 EXEOBJC = $(OUTDIR)\os_w32exec.obj $(OUTDIR)\vimc.res
 EXEOBJG = $(OUTDIR)\os_w32exeg.obj $(OUTDIR)\vimg.res
 CFLAGS = $(CFLAGS) -DVIMDLL
+! ifdef MZSCHEME
+EXECFLAGS =
+EXELIBC = $(LIBC)
+! else
+EXECFLAGS = -DUSE_OWNSTARTUP /GS-
+EXELIBC =
+! endif
 !else
 OBJ = $(OBJ) $(OUTDIR)\os_w32exe.obj $(OUTDIR)\vim.res
 !endif
@@ -1302,11 +1309,11 @@ $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) $(OUTDIR)\version.obj $(LINKARGS2)
 
 $(GVIM).exe: $(OUTDIR) $(EXEOBJG) $(VIMDLLBASE).dll
        $(LINK) $(LINKARGS1) /subsystem:$(SUBSYSTEM) -out:$(GVIM).exe \
-               $(EXEOBJG) $(VIMDLLBASE).lib
+               $(EXEOBJG) $(VIMDLLBASE).lib $(EXELIBC)
 
 $(VIM).exe: $(OUTDIR) $(EXEOBJC) $(VIMDLLBASE).dll
        $(LINK) $(LINKARGS1) /subsystem:$(SUBSYSTEM_CON) -out:$(VIM).exe \
-               $(EXEOBJC) $(VIMDLLBASE).lib
+               $(EXEOBJC) $(VIMDLLBASE).lib $(EXELIBC)
 
 !else
 
@@ -1380,12 +1387,16 @@ clean: testclean
        - if exist $(OUTDIR)/nul $(DEL_TREE) $(OUTDIR)
        - if exist *.obj del *.obj
        - if exist $(VIM).exe del $(VIM).exe
+       - if exist $(VIM).exp del $(VIM).exp
+       - if exist $(VIM).lib del $(VIM).lib
        - if exist $(VIM).ilk del $(VIM).ilk
        - if exist $(VIM).pdb del $(VIM).pdb
        - if exist $(VIM).map del $(VIM).map
        - if exist $(VIM).ncb del $(VIM).ncb
 !if "$(VIMDLL)" == "yes"
        - if exist $(GVIM).exe del $(GVIM).exe
+       - if exist $(GVIM).exp del $(GVIM).exp
+       - if exist $(GVIM).lib del $(GVIM).lib
        - if exist $(GVIM).map del $(GVIM).map
        - if exist $(VIMDLLBASE).dll del $(VIMDLLBASE).dll
        - if exist $(VIMDLLBASE).ilk del $(VIMDLLBASE).ilk
@@ -1715,10 +1726,10 @@ $(OUTDIR)/os_w32dll.obj:        $(OUTDIR) os_w32dll.c
 $(OUTDIR)/os_w32exe.obj:       $(OUTDIR) os_w32exe.c  $(INCL)
 
 $(OUTDIR)/os_w32exec.obj:      $(OUTDIR) os_w32exe.c  $(INCL)
-       $(CC) $(CFLAGS:-DFEAT_GUI_MSWIN=) /DUSE_OWNSTARTUP /GS- /Fo$@ os_w32exe.c
+       $(CC) $(CFLAGS:-DFEAT_GUI_MSWIN=) $(EXECFLAGS) /Fo$@ os_w32exe.c
 
 $(OUTDIR)/os_w32exeg.obj:      $(OUTDIR) os_w32exe.c  $(INCL)
-       $(CC) $(CFLAGS) /DUSE_OWNSTARTUP /GS- /Fo$@ os_w32exe.c
+       $(CC) $(CFLAGS) $(EXECFLAGS) /Fo$@ os_w32exe.c
 
 $(OUTDIR)/pathdef.obj: $(OUTDIR) $(PATHDEF_SRC) $(INCL)
        $(CC) $(CFLAGS_OUTDIR) $(PATHDEF_SRC)
index 9a9c48732b1734f4a004f658087650a901c166c9..4a8644c50f3292d7e7398a401f72398763f5f1f8 100644 (file)
@@ -383,7 +383,7 @@ static void (*dll_scheme_set_config_path)(Scheme_Object *p);
 # define scheme_null dll_scheme_null
 # define scheme_true dll_scheme_true
 
-// pointers are GetProceAddress'ed as pointers to pointer
+// pointers are GetProcAddress'ed as pointers to pointer
 #if !defined(USE_THREAD_LOCAL) && !defined(LINK_EXTENSIONS_BY_TABLE)
 #  define scheme_current_thread (*dll_scheme_current_thread_ptr)
 # endif
@@ -924,7 +924,7 @@ mzscheme_end(void)
 #endif
 }
 
-#if HAVE_TLS_SPACE
+#if HAVE_TLS_SPACE && !defined(VIMDLL)
 # if defined(_MSC_VER)
 static __declspec(thread) void *tls_space;
 extern intptr_t _tls_index;
@@ -960,7 +960,24 @@ mzscheme_main(void)
     }
 #endif
 #ifdef HAVE_TLS_SPACE
+# ifdef VIMDLL
+    void **ptls_space;
+    intptr_t tls_index;
+    void (*pget_tls_info)(void ***ptls_space, intptr_t *ptls_index);
+
+    // Get the address of get_tls_info() from (g)vim.exe.
+    pget_tls_info = (void *)GetProcAddress(
+                               GetModuleHandle(NULL), "get_tls_info");
+    if (pget_tls_info == NULL)
+    {
+       disabled = TRUE;
+       return vim_main2();
+    }
+    pget_tls_info(&ptls_space, &tls_index);
+    scheme_register_tls_space(ptls_space, tls_index);
+# else
     scheme_register_tls_space(&tls_space, _tls_index);
+# endif
 #endif
 #ifdef TRAMPOLINED_MZVIM_STARTUP
     return scheme_main_setup(TRUE, mzscheme_env_main, argc, &argv);
index 85bbfbcd216aeb260b8ecb3cf78a8af4868e2ce7..7aa4ead99ddcb87b36745c1f213ac8351bbdab60 100644 (file)
@@ -70,3 +70,24 @@ wmainCRTStartup(void)
 }
 # endif
 #endif // USE_OWNSTARTUP
+
+
+#if defined(VIMDLL) && defined(FEAT_MZSCHEME)
+
+# if defined(_MSC_VER)
+static __declspec(thread) void *tls_space;
+extern intptr_t _tls_index;
+# elif defined(__MINGW32__)
+static __thread void *tls_space;
+extern intptr_t _tls_index;
+# endif
+
+// Get TLS information that is needed for if_mzsch.
+    __declspec(dllexport) void
+get_tls_info(void ***ptls_space, intptr_t *ptls_index)
+{
+    *ptls_space = &tls_space;
+    *ptls_index = _tls_index;
+    return;
+}
+#endif
index a7b5405e431d7686ab0066e126f3e5cf96cd41b5..417e4003a5f124b0cd8405c16825b49818771f1d 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    630,
 /**/
     629,
 /**/