On Wed, 5 Dec 2018 at 18:45, Nicolas Cellier <nicolas.cellier.aka.nice@gmail.com> wrote:
 
Hi Ben,
I did not follow all the thread in detail, but a lot of missing definitions like alloca  were in platform specific support headers:


The fact that minheadless seems a (better ?) re-organisation of sources (I guess with a better separation of concerns) does not mean that we have to re-invent everything.
It's just there under our hands.

I don't think much is being reinvented. Its just minheadless branched before much work on 64-bit Windows.  
sqPlatformSpecific.h is very much reused,  as borne out by this diff...

.../platforms/win32/vm/sqPlatformSpecific.h                     .../platforms/minheadless/windows/sqPlatformSpecific-Win32.h
/* win32 sqPlatformSpecific.h -- Platform-specific prototypes   /* win32 sqPlatformSpecific.h -- Platform-specific prototypes
/* How to use this file:                                        /* How to use this file:
   This file is for general platform-specific macros and decl      This file is for general platform-specific macros and decl
   The goal is to keep most of the other header files generic      The goal is to keep most of the other header files generic
   To override a definition or macro from sq.h, you must firs      To override a definition or macro from sq.h, you must firs
   provide the new definition.                                     provide the new definition.
*/                                                              */
#if _WIN32 || _WIN64                                          | #ifdef WIN32
/* Override necessary definitions */                            /* Override necessary definitions */
#undef putchar                                                  #undef putchar
#include "sqWin32Alloc.h"                                       #include "sqWin32Alloc.h"

#ifdef _MSC_VER                                                 #ifdef _MSC_VER
#include <windows.h>                                            #include <windows.h>
#define HAVE_BOOLEAN 1 /* for jpegReaderWriter plugin compati   #define HAVE_BOOLEAN 1 /* for jpegReaderWriter plugin compati
#endif                                                          #endif

#ifdef _MSC_VER                                                 #ifdef _MSC_VER
#define squeakFileOffsetType __int64                            #define squeakFileOffsetType __int64
#else                                                           #else
#define squeakFileOffsetType unsigned long long                 #define squeakFileOffsetType unsigned long long
#endif                                                          #endif

#ifdef WIN32_FILE_SUPPORT                                       #ifdef WIN32_FILE_SUPPORT

#undef sqImageFile                                              #undef sqImageFile
#undef sqImageFileClose                                         #undef sqImageFileClose
#undef sqImageFileOpen                                          #undef sqImageFileOpen
#undef sqImageFilePosition                                      #undef sqImageFilePosition
#undef sqImageFileRead                                          #undef sqImageFileRead
#undef sqImageFileSeek                                          #undef sqImageFileSeek
#undef sqImageFileSeekEnd                                       #undef sqImageFileSeekEnd
#undef sqImageFileWrite                                         #undef sqImageFileWrite

#define sqImageFile usqIntptr_t                                 #define sqImageFile usqIntptr_t
sqInt sqImageFileClose(sqImageFile h);                          sqInt sqImageFileClose(sqImageFile h);
sqImageFile sqImageFileOpen(const char *fileName, const char    sqImageFile sqImageFileOpen(const char *fileName, const char 
squeakFileOffsetType sqImageFilePosition(sqImageFile h);        squeakFileOffsetType sqImageFilePosition(sqImageFile h);
size_t sqImageFileRead(void *ptr, size_t sz, size_t count, sq   size_t sqImageFileRead(void *ptr, size_t sz, size_t count, sq
squeakFileOffsetType sqImageFileSeek(sqImageFile h, squeakFil   squeakFileOffsetType sqImageFileSeek(sqImageFile h, squeakFil
squeakFileOffsetType sqImageFileSeekEnd(sqImageFile h, squeak   squeakFileOffsetType sqImageFileSeekEnd(sqImageFile h, squeak
size_t sqImageFileWrite(const void *ptr, size_t sz, size_t co   size_t sqImageFileWrite(const void *ptr, size_t sz, size_t co
#else /* when no WIN32_FILE_SUPPORT, add necessary stub for u   #else /* when no WIN32_FILE_SUPPORT, add necessary stub for u
#include <stdlib.h>                                             #include <stdlib.h>
#include <io.h> /* _get_osfhandle */                            #include <io.h> /* _get_osfhandle */
                                                              > #ifndef PATH_MAX
#define PATH_MAX _MAX_PATH                                      #define PATH_MAX _MAX_PATH
                                                              > #endif

#define fsync(filenumber) FlushFileBuffers((HANDLE)_get_osfha   #define fsync(filenumber) FlushFileBuffers((HANDLE)_get_osfha
#endif /* WIN32_FILE_SUPPORT */                                 #endif /* WIN32_FILE_SUPPORT */

/* pluggable primitive support */                               /* pluggable primitive support */
#if defined(_MSC_VER) || defined(__MINGW32__)                   #if defined(_MSC_VER) || defined(__MINGW32__)
#  undef EXPORT                                                 #  undef EXPORT
#  define EXPORT(returnType) __declspec( dllexport ) returnTy   #  define EXPORT(returnType) __declspec( dllexport ) returnTy
#  undef VM_EXPORT                                              #  undef VM_EXPORT
#  define VM_EXPORT __declspec( dllexport )                     #  define VM_EXPORT __declspec( dllexport )
                                                              > #  if defined(BUILD_VM_CORE) && !defined(VM_CORE_STATIC)
                                                              > #    undef VM_FUNCTION_EXPORT
                                                              > #    define VM_FUNCTION_EXPORT(returnType) __declspec( dllexport ) returnType
                                                              > #  else
                                                              > #    undef VM_FUNCTION_EXPORT
                                                              > #    define VM_FUNCTION_EXPORT(returnType) __declspec( dllimport ) returnType
                                                              > #  endif
#endif                                                          #endif


/* missing functions */                                         /* missing functions */
#ifdef _MSC_VER                                                 #ifdef _MSC_VER
/* see on msdn the list of functions available                  /* see on msdn the list of functions available
 *  CRT Alphabetical Function Reference                          *  CRT Alphabetical Function Reference
#  include <malloc.h>                                           #  include <malloc.h>
#  include <float.h>                                            #  include <float.h>
#  ifndef alloca                                                #  ifndef alloca
#    define alloca _alloca                                      #    define alloca _alloca
#  endif                                                        #  endif
#  if _MSC_VER < 1800 /* not available before MSVC 2013 */      #  if _MSC_VER < 1800 /* not available before MSVC 2013 */
#    define atoll(x)              _atoi64(x)                    #    define atoll(x)              _atoi64(x)
#    define strtoll(beg,end,base) _strtoi64(beg,end,base)       #    define strtoll(beg,end,base) _strtoi64(beg,end,base)
     double round(double);                                           double round(double);
#  endif                                                        #  endif
#  if _MSC_VER < 1900 /* not available before MSVC 2015 */      #  if _MSC_VER < 1900 /* not available before MSVC 2015 */
#    define snprintf _snprintf                                  #    define snprintf _snprintf
#    ifndef isnan                                               #    ifndef isnan
#      define isnan _isnan                                      #      define isnan _isnan
#    endif                                                      #    endif
#  endif                                                        #  endif
#  if _MSC_VER < 1300 /* maybe not available before MSVC 7.0    #  if _MSC_VER < 1300 /* maybe not available before MSVC 7.0 
#    define fabsf(x)    ((float)fabs((double)(x)))              #    define fabsf(x)    ((float)fabs((double)(x)))
#  endif                                                        #  endif
#  define bzero(pointer,size) ZeroMemory(pointer,size)          #  define bzero(pointer,size) ZeroMemory(pointer,size)
                                                              > #else
                                                              > #  include <string.h>
                                                              > #  define bzero(pointer,size) memset(pointer, 0, size)
#endif                                                          #endif

#ifdef __GNUC__                                                 #ifdef __GNUC__
#  if __GNUC__ < 3                                              #  if __GNUC__ < 3
#    define fabsf(x)    ((float)fabs((double)(x))) /* not sur   #    define fabsf(x)    ((float)fabs((double)(x))) /* not sur
#  endif                                                        #  endif
#endif                                                          #endif

#else                                                           #else
error "Not Win32 or Win64!"                                   | error "Not Win32!"
#endif /* _WIN32 || _WIN64 */                                 | #endif /* WIN32 */

int ioSetCursorARGB(sqInt bitsIndex, sqInt w, sqInt h, sqInt    int ioSetCursorARGB(sqInt bitsIndex, sqInt w, sqInt h, sqInt 

/* poll and profile thread priorities.  The stack vm uses a t   /* poll and profile thread priorities.  The stack vm uses a t
 * VM to poll for I/O, check for delay expiry et al at regula    * VM to poll for I/O, check for delay expiry et al at regula
 * VMs use a thread to sample the pc for VM profiling.  The p    * VMs use a thread to sample the pc for VM profiling.  The p
 * to have a priority higher than the main VM thread and the     * to have a priority higher than the main VM thread and the 
 * to have a priority higher than the poll thread to be able     * to have a priority higher than the poll thread to be able 
 * We would like POLL_THREAD_PRIORITY to be THREAD_PRIORITY_T    * We would like POLL_THREAD_PRIORITY to be THREAD_PRIORITY_T
 * but SetThreadPriority fails with this value on Windows XP.    * but SetThreadPriority fails with this value on Windows XP.
 *                                                               *
 * N.B. THREAD_PRIORITY_TIME_CRITICAL a.k.a. THREAD_BASE_PRIO    * N.B. THREAD_PRIORITY_TIME_CRITICAL a.k.a. THREAD_BASE_PRIO
 *      THREAD_PRIORITY_MAX a.k.a. THREAD_BASE_PRIORITY_MAX      *      THREAD_PRIORITY_MAX a.k.a. THREAD_BASE_PRIORITY_MAX
 * See WinBase.h & WinNT.h.                                      * See WinBase.h & WinNT.h.
 */                                                              */
#if STACKVM                                                     #if STACKVM
# define POLL_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST           # define POLL_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST
#endif /* STACKVM */                                            #endif /* STACKVM */
#define PROF_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL      #define PROF_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL

#if COGVM                                                       #if COGVM
extern void sqMakeMemoryExecutableFromTo(usqIntptr_t, usqIntp   extern void sqMakeMemoryExecutableFromTo(usqIntptr_t, usqIntp
extern void sqMakeMemoryNotExecutableFromTo(usqIntptr_t, usqI   extern void sqMakeMemoryNotExecutableFromTo(usqIntptr_t, usqI

extern int isCFramePointerInUse(void);                          extern int isCFramePointerInUse(void);
extern int osCogStackPageHeadroom(void);                        extern int osCogStackPageHeadroom(void);
extern void reportMinimumUnusedHeadroom(void);                  extern void reportMinimumUnusedHeadroom(void);
#endif                                                          #endif

/* Thread support for thread-safe signalSemaphoreWithIndex an   /* Thread support for thread-safe signalSemaphoreWithIndex an
#if STACKVM || NewspeakVM                                       #if STACKVM || NewspeakVM
# define sqLowLevelYield() Sleep(0)                             # define sqLowLevelYield() Sleep(0)
/* these are used both in the STACKVM & the COGMTVM */          /* these are used both in the STACKVM & the COGMTVM */
# define sqOSThread void *                                      # define sqOSThread void *
# define ioOSThreadsEqual(a,b) ((a) == (b))                     # define ioOSThreadsEqual(a,b) ((a) == (b))
# if COGMTVM                                                    # if COGMTVM
/* Please read the comment for CogThreadManager in the VMMake   /* Please read the comment for CogThreadManager in the VMMake
 * documentation of this API.                                    * documentation of this API.
 */                                                              */
#  define sqOSSemaphore void *                                  #  define sqOSSemaphore void *
#  if !ForCOGMTVMImplementation /* this is a read-only export   #  if !ForCOGMTVMImplementation /* this is a read-only export
extern const unsigned long tltiIndex;                           extern const unsigned long tltiIndex;
#  endif                                                        #  endif
#  define ioGetThreadLocalThreadIndex() ((long)TlsGetValue(tl   #  define ioGetThreadLocalThreadIndex() ((long)TlsGetValue(tl
#  define ioSetThreadLocalThreadIndex(v) (TlsSetValue(tltiInd   #  define ioSetThreadLocalThreadIndex(v) (TlsSetValue(tltiInd
#  define ioTransferTimeslice() Sleep(0)                        #  define ioTransferTimeslice() Sleep(0)
#  define ioMilliSleep(ms) Sleep(ms)                            #  define ioMilliSleep(ms) Sleep(ms)
# endif /* COGMTVM */                                           # endif /* COGMTVM */
#endif /* STACKVM || NewspeakVM */                              #endif /* STACKVM || NewspeakVM */

#if defined(__GNUC__)                                           #if defined(__GNUC__)
# if !defined(VM_LABEL)                                         # if !defined(VM_LABEL)
#       define VM_LABEL(foo) asm("\n.globl L" #foo "\nL" #foo   #       define VM_LABEL(foo) asm("\n.globl L" #foo "\nL" #foo
# endif                                                         # endif
#endif                                                          #endif
#if !defined(VM_LABEL) || COGVM                                 #if !defined(VM_LABEL) || COGVM
# undef VM_LABEL                                                # undef VM_LABEL
# define VM_LABEL(foo) ((void)0)                              | # define VM_LABEL(foo) 0
#endif                                                          #endif

/* Define the fields in a struct _CONTEXT as returned by GetThreadContext that
 * represent the program counter and frame pointer on the current architecture.
 */
#if defined(_M_IX86) || defined(_M_I386) || defined(_X86_) || defined(i386) || defined(__i386__)
# define CONTEXT_PC Eip
# define CONTEXT_FP Ebp
# define CONTEXT_SP Esp
#elif defined(x86_64) || defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(__amd64__) || defined(x64) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64)
# define CONTEXT_PC Rip
# define CONTEXT_FP Rbp
# define CONTEXT_SP Rsp
#else
# error "unknown architecture, program counter field undefined"
#endif
                                                              > #ifdef _MSC_VER
                                                              > /* disable "function XXXX: no return value" */
                                                              > #pragma warning(disable:4035)
                                                              > /* optional C SEH macros */
                                                              > #define TRY __try
                                                              > #define EXCEPT(filter) __except(filter)
                                                              > #define FINALLY __finally
                                                              > #else
                                                              > /* optional C SEH macros */
                                                              > #define TRY
                                                              > #define EXCEPT(filter) if (0)
                                                              > #define FINALLY
                                                              > #endif


But perhaps instead of my change to "platforms/Cross/plugins/IA32ABI/x64win64abicc.c" here... 
it would have been better to include "sqPlatformSpecific.h" ?  Or would that be heavy handed? I don't know.
At the time it seemed reasonable to echo the similar define here...
   platforms/Cross/plugins/IA32ABI/ia32abicc.c:   # define alloca _alloca

cheers -ben

P.S. It might be good to reconcile the two files, but I don't know enough about all the changes myself.
And to avoid divergence maybe(??) one file should #include the other instead of being a copy. 
Or would that be a bad??