diff --git a/Changelog b/Changelog
index 8264d1db..c794d6ee 100644
--- a/Changelog
+++ b/Changelog
@@ -16,14 +16,14 @@ Platforms:
 - vastly improved support for ARM hard float calling convention
    (Thomas Preud'homme, Daniel Glöckner)
 - provide a runtime library for ARM (Thomas Preud'homme)
-- many x86-64 ABI fixes incl. XMM register passing and tests (James Lyon)
+- many x86_64 ABI fixes incl. XMM register passing and tests (James Lyon)
 - ABI tests with native compiler using libtcc (James Lyon)
 - UNICODE startup code supports wmain and wWinMain (YX Hao)
 
 Features:
 - VLA (variable length array) improved (James Lyon, Pip Cet)
 - import functions by ordinal in .def files on windows (YX Hao)
-- x86/x86-64 assembler much improved (Michael Matz)
+- x86/x86_64 assembler much improved (Michael Matz)
 - simple dead code suppression (Edmund Grimley Evans, Michael Matz, grischka)
 - implement round/fmin/fmax etc. math on windows (Avi Halachmi)
 - #pragma once support (Sergey Korshunoff, Vlad Vissoultchev, ...)
diff --git a/Makefile b/Makefile
index f9008ffa..00d17bb1 100644
--- a/Makefile
+++ b/Makefile
@@ -56,7 +56,7 @@ LDFLAGS_P = $(LDFLAGS)
 
 CONFIG_$(ARCH) = yes
 NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
-NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64
+NATIVE_DEFINES_$(CONFIG_x86_64) += -DTCC_TARGET_X86_64
 NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
 NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
 NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
@@ -95,7 +95,7 @@ ARM64_FILES = $(CORE_FILES) arm64-gen.c arm64-link.c
 C67_FILES = $(CORE_FILES) c67-gen.c c67-link.c tcccoff.c
 
 ifdef CONFIG_WIN32
- ifeq ($(ARCH),x86-64)
+ ifeq ($(ARCH),x86_64)
   NATIVE_FILES=$(WIN64_FILES)
   PROGS_CROSS=$(WIN32_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
   LIBTCC1_CROSS=lib/i386-win32/libtcc1.a
@@ -110,7 +110,7 @@ NATIVE_FILES=$(I386_FILES)
 PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
 LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
 
-else ifeq ($(ARCH),x86-64)
+else ifeq ($(ARCH),x86_64)
 NATIVE_FILES=$(X86_64_FILES)
 PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
 LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
diff --git a/README b/README
index 0b789b2d..3a3f90be 100644
--- a/README
+++ b/README
@@ -28,28 +28,19 @@ Features:
 Documentation:
 -------------
 
-1) Installation on a i386/x86_64/arm Linux/OSX/FreeBSD host (for Windows read tcc-win32.txt)
-
-Note: For OSX and FreeBSD, gmake should be used instead of make.
+1) Installation on a i386/x86_64/arm Linux/OSX/FreeBSD host
 
    ./configure
    make
    make test
    make install
 
-Alternatively, out-of-tree builds are supported: you may use different
-directories to hold build objects, kept separate from your source tree:
+   Notes: For OSX and FreeBSD, gmake should be used instead of make.
+   For Windows read tcc-win32.txt.
 
-   mkdir _build
-   cd _build
-   ../configure
-   make
-   make test
-   make install
-
-Texi2html must be installed to compile the doc. 
-By default, tcc is installed in /usr/local/bin.
-./configure --help  shows configuration options.
+makeinfo must be installed to compile the doc.  By default, tcc is
+installed in /usr/local/bin.  ./configure --help  shows configuration
+options.
 
 
 2) Introduction
diff --git a/configure b/configure
index 37998056..d1cb838b 100755
--- a/configure
+++ b/configure
@@ -163,8 +163,8 @@ case "$cpu" in
   x86|i386|i486|i586|i686|i86pc|BePC|i686-AT386)
     cpu="x86"
   ;;
-  x86_64|amd64)
-    cpu="x86-64"
+  x86_64|amd64|x86-64)
+    cpu="x86_64"
   ;;
   arm*)
     case "$cpu" in
@@ -332,7 +332,7 @@ if test -z "$cross_prefix" ; then
       fi
 
       if test -z "$triplet"; then
-        if test $cpu = "x86-64" -o $cpu = "aarch64" ; then
+        if test $cpu = "x86_64" -o $cpu = "aarch64" ; then
           if test -f "/usr/lib64/crti.o" ; then
             tcc_lddir="lib64"
           fi
@@ -453,8 +453,8 @@ echo "#define GCC_MINOR $gcc_minor" >> $TMPH
 
 if test "$cpu" = "x86" ; then
   echo "ARCH=i386" >> config.mak
-elif test "$cpu" = "x86-64" ; then
-  echo "ARCH=x86-64" >> config.mak
+elif test "$cpu" = "x86_64" ; then
+  echo "ARCH=x86_64" >> config.mak
 elif test "$cpu" = "armv4l" ; then
   echo "ARCH=arm" >> config.mak
   echo "#define TCC_ARM_VERSION $cpuver" >> $TMPH
diff --git a/lib/Makefile b/lib/Makefile
index 85dc5cf5..1fb37afc 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -9,14 +9,14 @@ VPATH = $(TOPSRC)/lib $(TOPSRC)/win32/lib
 ifndef TARGET
  # we're building the native libtcc1.a
  ifdef CONFIG_WIN32
-  ifeq ($(ARCH),x86-64)
+  ifeq ($(ARCH),x86_64)
    TARGET = x86_64-win32
   else
    TARGET = i386-win32
   endif
  else ifeq ($(ARCH),i386)
   TARGET = i386
- else ifeq ($(ARCH),x86-64)
+ else ifeq ($(ARCH),x86_64)
   TARGET = x86_64
  else ifeq ($(ARCH),arm)
   TARGET = arm
@@ -83,6 +83,9 @@ $(DIR)/%.o : %.c
 $(DIR)/%.o : %.S
 	$(XCC) -c $< -o $@ $(TGT) $(XFLAGS)
 
+$(DIR)/crt1w.o : crt1.c
+$(DIR)/wincrt1w.o : wincrt1.c
+
 $(OBJ) : $(DIR)/exists
 
 %/exists :
diff --git a/libtcc.c b/libtcc.c
index 9abb8548..bbaf17f9 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1572,7 +1572,6 @@ static const FlagDef options_f[] = {
     { offsetof(TCCState, nocommon), FD_INVERT, "common" },
     { offsetof(TCCState, leading_underscore), 0, "leading-underscore" },
     { offsetof(TCCState, ms_extensions), 0, "ms-extensions" },
-    { offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" },
     { offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" },
     { 0, 0, NULL }
 };
@@ -1984,21 +1983,3 @@ PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time)
     fprintf(stderr, "* %d bytes memory used\n", mem_max_size);
 #endif
 }
-
-PUB_FUNC void tcc_set_environment(TCCState *s)
-{
-    char * path;
-
-    path = getenv("C_INCLUDE_PATH");
-    if(path != NULL) {
-        tcc_add_include_path(s, path);
-    }
-    path = getenv("CPATH");
-    if(path != NULL) {
-        tcc_add_include_path(s, path);
-    }
-    path = getenv("LIBRARY_PATH");
-    if(path != NULL) {
-        tcc_add_library_path(s, path);
-    }
-}
diff --git a/tcc-doc.texi b/tcc-doc.texi
index a1c6761e..c1396bad 100644
--- a/tcc-doc.texi
+++ b/tcc-doc.texi
@@ -387,10 +387,10 @@ gcc's algorithm.
 Select the float ABI. Possible values: @code{softfp} and @code{hard}
 
 @item -mno-sse
-Do not use sse registers on x86-64
+Do not use sse registers on x86_64
 
 @item -m32, -m64
-Pass command line to the i386/x86-64 cross compiler.
+Pass command line to the i386/x86_64 cross compiler.
 
 @end table
 
diff --git a/tcc.c b/tcc.c
index 5890b890..a5046614 100644
--- a/tcc.c
+++ b/tcc.c
@@ -104,9 +104,8 @@ static const char help2[] =
     "  signed-char                   default char is signed\n"
     "  common                        use common section instead of bss\n"
     "  leading-underscore            decorate extern symbols\n"
-    "  ms-extensions                 allow struct w/o identifier\n"
+    "  ms-extensions                 allow anonymous struct in struct\n"
     "  dollars-in-identifiers        allow '$' in C symbols\n"
-    "  old-struct-init-code          some hack for parsing initializers\n"
     "-m... target specific options:\n"
     "  ms-bitfields                  use MSVC bitfield layout\n"
 #ifdef TCC_TARGET_ARM
@@ -151,32 +150,18 @@ static const char version[] =
         "C67"
 #elif defined TCC_TARGET_ARM
         "ARM"
-# ifdef TCC_ARM_HARDFLOAT
-        " Hard Float"
-# endif
 #elif defined TCC_TARGET_ARM64
         "AArch64"
-# ifdef TCC_ARM_HARDFLOAT
+#endif
+#ifdef TCC_ARM_HARDFLOAT
         " Hard Float"
-# endif
 #endif
 #ifdef TCC_TARGET_PE
         " Windows"
-#elif defined(__APPLE__)
-        /* Current Apple OS name as of 2016 */
-        " macOS"
 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
         " FreeBSD"
-#elif defined(__DragonFly__)
-        " DragonFly BSD"
-#elif defined(__NetBSD__)
-        " NetBSD"
-#elif defined(__OpenBSD__)
-        " OpenBSD"
-#elif defined(__linux__)
-        " Linux"
 #else
-        " Unidentified system"
+        " Linux"
 #endif
     ")\n"
     ;
@@ -201,6 +186,24 @@ static void print_search_dirs(TCCState *s)
 #endif
 }
 
+static void set_environment(TCCState *s)
+{
+    char * path;
+
+    path = getenv("C_INCLUDE_PATH");
+    if(path != NULL) {
+        tcc_add_include_path(s, path);
+    }
+    path = getenv("CPATH");
+    if(path != NULL) {
+        tcc_add_include_path(s, path);
+    }
+    path = getenv("LIBRARY_PATH");
+    if(path != NULL) {
+        tcc_add_library_path(s, path);
+    }
+}
+
 static char *default_outputfile(TCCState *s, const char *first_file)
 {
     char buf[1024];
@@ -265,9 +268,6 @@ redo:
 #endif
         if (opt == OPT_V)
             return 0;
-
-        tcc_set_environment(s);
-
         if (opt == OPT_PRINT_DIRS) {
             /* initialize search dirs */
             tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
@@ -287,8 +287,8 @@ redo:
                 if (!s->ppfp)
                     tcc_error("could not write '%s'", s->outfile);
             }
-        } else if (s->output_type == TCC_OUTPUT_OBJ) {
-            if (s->nb_libraries != 0 && !s->option_r)
+        } else if (s->output_type == TCC_OUTPUT_OBJ && !s->option_r) {
+            if (s->nb_libraries)
                 tcc_error("cannot specify libraries with -c");
             if (n > 1 && s->outfile)
                 tcc_error("cannot specify output file with -c many files");
@@ -301,6 +301,7 @@ redo:
             start_time = getclock_ms();
     }
 
+    set_environment(s);
     if (s->output_type == 0)
         s->output_type = TCC_OUTPUT_EXE;
     tcc_set_output_type(s, s->output_type);
@@ -323,7 +324,8 @@ redo:
         }
         s->filetype = 0;
         s->alacarte_link = 1;
-        if (ret || --n == 0 || s->output_type == TCC_OUTPUT_OBJ)
+        if (ret || --n == 0
+            || (s->output_type == TCC_OUTPUT_OBJ && !s->option_r))
             break;
     }
 
diff --git a/tcc.h b/tcc.h
index 0e22e68f..bc1bd69b 100644
--- a/tcc.h
+++ b/tcc.h
@@ -615,9 +615,7 @@ struct TCCState {
     /* C language options */
     int char_is_unsigned;
     int leading_underscore;
-    int ms_extensions;		/* allow nested named struct w/o identifier behave like unnamed */
-    int old_struct_init_code;	/* use old algorithm to init array in struct when there is no '{' used.
-				   Liuux 2.4.26 can't find initrd when compiled with a new algorithm */
+    int ms_extensions;	/* allow nested named struct w/o identifier behave like unnamed */
     int dollars_in_identifiers;	/* allows '$' char in indentifiers */
     int ms_bitfields; /* if true, emulate MS algorithm for aligning bitfields */
 
@@ -1147,10 +1145,8 @@ ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags);
 
 ST_FUNC void tcc_add_pragma_libs(TCCState *s1);
 PUB_FUNC int tcc_add_library_err(TCCState *s, const char *f);
-
 PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time);
 PUB_FUNC int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind);
-PUB_FUNC void tcc_set_environment(TCCState *s);
 #ifdef _WIN32
 ST_FUNC char *normalize_slashes(char *path);
 #endif
@@ -1276,8 +1272,15 @@ ST_DATA int func_vc;
 ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */
 ST_DATA const char *funcname;
 
+ST_FUNC void tcc_debug_start(TCCState *s1);
+ST_FUNC void tcc_debug_end(TCCState *s1);
+ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym);
+ST_FUNC void tcc_debug_funcend(TCCState *s1, int size);
+ST_FUNC void tcc_debug_line(TCCState *s1);
+
 ST_FUNC void tccgen_start(TCCState *s1);
 ST_FUNC void tccgen_end(TCCState *s1);
+
 ST_FUNC void free_inline_functions(TCCState *s);
 ST_FUNC void check_vstack(void);
 
diff --git a/tccasm.c b/tccasm.c
index 0999a036..b8334084 100644
--- a/tccasm.c
+++ b/tccasm.c
@@ -926,10 +926,13 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess, int global)
     set_idnum('.', IS_ID);
     if (do_preprocess)
         parse_flags |= PARSE_FLAG_PREPROCESS;
-    next();
     for(;;) {
+        next();
         if (tok == TOK_EOF)
             break;
+        /* generate line number info */
+        if (global && s1->do_debug)
+            tcc_debug_line(s1);
         parse_flags |= PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
     redo:
         if (tok == '#') {
@@ -981,15 +984,12 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess, int global)
             }
         }
         /* end of line */
-        if (tok != ';' && tok != TOK_LINEFEED){
+        if (tok != ';' && tok != TOK_LINEFEED)
             expect("end of line");
-        }
         parse_flags &= ~PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
-        next();
     }
 
     asm_free_labels(s1);
-
     return 0;
 }
 
@@ -1001,24 +1001,19 @@ ST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess)
 
     define_start = define_stack;
     preprocess_start(s1);
+    tcc_debug_start(s1);
 
     /* default section is text */
     cur_text_section = text_section;
     ind = cur_text_section->data_offset;
     nocode_wanted = 0;
 
-    /* an elf symbol of type STT_FILE must be put so that STB_LOCAL
-       symbols can be safely used */
-    put_elf_sym(symtab_section, 0, 0,
-                ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,
-                SHN_ABS, file->filename);
-
     ret = tcc_assemble_internal(s1, do_preprocess, 1);
 
     cur_text_section->data_offset = ind;
 
+    tcc_debug_end(s1);
     free_defines(define_start); 
-
     return ret;
 }
 
diff --git a/tccgen.c b/tccgen.c
index 1919c3cb..131dced5 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -139,6 +139,88 @@ void pv (const char *lbl, int a, int b)
 }
 #endif
 
+/* ------------------------------------------------------------------------- */
+/* start of translation unit info */
+ST_FUNC void tcc_debug_start(TCCState *s1)
+{
+    if (s1->do_debug) {
+        char buf[512];
+
+        /* file info: full path + filename */
+        section_sym = put_elf_sym(symtab_section, 0, 0,
+                                  ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0,
+                                  text_section->sh_num, NULL);
+        getcwd(buf, sizeof(buf));
+#ifdef _WIN32
+        normalize_slashes(buf);
+#endif
+        pstrcat(buf, sizeof(buf), "/");
+        put_stabs_r(buf, N_SO, 0, 0,
+                    text_section->data_offset, text_section, section_sym);
+        put_stabs_r(file->filename, N_SO, 0, 0,
+                    text_section->data_offset, text_section, section_sym);
+        last_ind = 0;
+        last_line_num = 0;
+    }
+
+    /* an elf symbol of type STT_FILE must be put so that STB_LOCAL
+       symbols can be safely used */
+    put_elf_sym(symtab_section, 0, 0,
+                ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,
+                SHN_ABS, file->filename);
+}
+
+/* put end of translation unit info */
+ST_FUNC void tcc_debug_end(TCCState *s1)
+{
+    if (!s1->do_debug)
+        return;
+    put_stabs_r(NULL, N_SO, 0, 0,
+        text_section->data_offset, text_section, section_sym);
+
+}
+
+/* generate line number info */
+ST_FUNC void tcc_debug_line(TCCState *s1)
+{
+    if (!s1->do_debug)
+        return;
+    if ((last_line_num != file->line_num || last_ind != ind)) {
+        put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);
+        last_ind = ind;
+        last_line_num = file->line_num;
+    }
+}
+
+/* put function symbol */
+ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym)
+{
+    char buf[512];
+
+    if (!s1->do_debug)
+        return;
+
+    /* stabs info */
+    /* XXX: we put here a dummy type */
+    snprintf(buf, sizeof(buf), "%s:%c1",
+             funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
+    put_stabs_r(buf, N_FUN, 0, file->line_num, 0,
+                cur_text_section, sym->c);
+    /* //gr gdb wants a line at the function */
+    put_stabn(N_SLINE, 0, file->line_num, 0);
+
+    last_ind = 0;
+    last_line_num = 0;
+}
+
+/* put function size */
+ST_FUNC void tcc_debug_funcend(TCCState *s1, int size)
+{
+    if (!s1->do_debug)
+        return;
+    put_stabn(N_FUN, 0, 0, size);
+}
+
 /* ------------------------------------------------------------------------- */
 ST_FUNC void tccgen_start(TCCState *s1)
 {
@@ -161,28 +243,7 @@ ST_FUNC void tccgen_start(TCCState *s1)
     func_old_type.t = VT_FUNC;
     func_old_type.ref = sym_push(SYM_FIELD, &int_type, FUNC_CDECL, FUNC_OLD);
 
-    if (s1->do_debug) {
-        char buf[512];
-
-        /* file info: full path + filename */
-        section_sym = put_elf_sym(symtab_section, 0, 0,
-                                  ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0,
-                                  text_section->sh_num, NULL);
-        getcwd(buf, sizeof(buf));
-#ifdef _WIN32
-        normalize_slashes(buf);
-#endif
-        pstrcat(buf, sizeof(buf), "/");
-        put_stabs_r(buf, N_SO, 0, 0,
-                    text_section->data_offset, text_section, section_sym);
-        put_stabs_r(file->filename, N_SO, 0, 0,
-                    text_section->data_offset, text_section, section_sym);
-    }
-    /* an elf symbol of type STT_FILE must be put so that STB_LOCAL
-       symbols can be safely used */
-    put_elf_sym(symtab_section, 0, 0,
-                ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,
-                SHN_ABS, file->filename);
+    tcc_debug_start(s1);
 
 #ifdef TCC_TARGET_ARM
     arm_init(s1);
@@ -194,10 +255,7 @@ ST_FUNC void tccgen_end(TCCState *s1)
     gen_inline_functions(s1);
     check_vstack();
     /* end of translation unit info */
-    if (s1->do_debug) {
-        put_stabs_r(NULL, N_SO, 0, 0,
-                    text_section->data_offset, text_section, section_sym);
-    }
+    tcc_debug_end(s1);
 }
 
 /* ------------------------------------------------------------------------- */
@@ -5567,12 +5625,8 @@ static void block(int *bsym, int *csym, int is_expr)
     Sym *s;
 
     /* generate line number info */
-    if (tcc_state->do_debug &&
-        (last_line_num != file->line_num || last_ind != ind)) {
-        put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);
-        last_ind = ind;
-        last_line_num = file->line_num;
-    }
+    if (tcc_state->do_debug)
+        tcc_debug_line(tcc_state);
 
     if (is_expr) {
         /* default return value is (void) */
@@ -6741,22 +6795,6 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r,
     }
 }
 
-static void put_func_debug(Sym *sym)
-{
-    char buf[512];
-
-    /* stabs info */
-    /* XXX: we put here a dummy type */
-    snprintf(buf, sizeof(buf), "%s:%c1", 
-             funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
-    put_stabs_r(buf, N_FUN, 0, file->line_num, 0,
-                cur_text_section, sym->c);
-    /* //gr gdb wants a line at the function */
-    put_stabn(N_SLINE, 0, file->line_num, 0); 
-    last_ind = 0;
-    last_line_num = 0;
-}
-
 /* parse an old style function declaration list */
 /* XXX: check multiple parameter */
 static void func_decl_list(Sym *func_sym)
@@ -6820,15 +6858,12 @@ static void gen_function(Sym *sym)
     vla_sp_loc = -1;
     vla_sp_root_loc = -1;
     /* put debug symbol */
-    if (tcc_state->do_debug)
-        put_func_debug(sym);
-
+    tcc_debug_funcstart(tcc_state, sym);
     /* push a dummy symbol to enable local sym storage */
     sym_push2(&local_stack, SYM_FIELD, 0, 0);
     local_scope = 1; /* for function parameters */
     gfunc_prolog(&sym->type);
     local_scope = 0;
-
     rsym = 0;
     block(NULL, NULL, 0);
     nocode_wanted = 0;
@@ -6847,9 +6882,7 @@ static void gen_function(Sym *sym)
     if (sym->type.t & VT_WEAK)
         weaken_symbol(sym);
     apply_visibility(sym, &sym->type);
-    if (tcc_state->do_debug) {
-        put_stabn(N_FUN, 0, 0, ind - func_ind);
-    }
+    tcc_debug_funcend(tcc_state, ind - func_ind);
     /* It's better to crash than to generate wrong code */
     cur_text_section = NULL;
     funcname = ""; /* for safety */
diff --git a/tests/Makefile b/tests/Makefile
index dbd035f8..558d06c7 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -36,13 +36,13 @@ endif
 ifeq ($(TARGETOS),Darwin)
  TESTS := $(filter-out hello-exe test3 $(BTESTS),$(TESTS))
 endif
-ifeq (,$(filter arm64 i386 x86-64,$(ARCH)))
+ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
  TESTS := $(filter-out vla_test-run,$(TESTS))
 endif
 ifeq ($(CONFIG_arm_eabi),yes)
  TESTS := $(filter-out test3,$(TESTS))
 endif
-ifeq (,$(filter i386 x86-64,$(ARCH)))
+ifeq (,$(filter i386 x86_64,$(ARCH)))
  TESTS := $(filter-out dlltest,$(TESTS))
 endif
 
diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile
index ef82d2a5..52f590f3 100644
--- a/tests/tests2/Makefile
+++ b/tests/tests2/Makefile
@@ -22,10 +22,10 @@ endif
 ifeq ($(TARGETOS),Darwin)
  SKIP += 40_stdio.test
 endif
-ifeq ($(ARCH),x86-64)
+ifeq ($(ARCH),x86_64)
  SKIP += 73_arm64.test
 endif
-ifeq (,$(filter i386 x86-64,$(ARCH)))
+ifeq (,$(filter i386 x86_64,$(ARCH)))
  SKIP += 85_asm-outside-function.test
 endif
 
diff --git a/win32/Makefile b/win32/Makefile
index 19c9ee42..1a5582f5 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -24,11 +24,9 @@ TARGET	= $(CPU)
 ifeq ($(TARGET), 64)
 TFLAGS	= -m$(TARGET) -DTCC_TARGET_X86_64
 TARCH	= x86_64
-CARCH	= x86-64
 else
 TFLAGS	= -m$(TARGET) -DTCC_TARGET_I386
 TARCH	= i386
-CARCH	= i386
 endif
 
 all: pre bootstrap libs rebuild
@@ -36,7 +34,7 @@ all: pre bootstrap libs rebuild
 	@ls -ls *.exe
 
 pre:
-	@echo ARCH=$(CARCH) 1> ../config.mak
+	@echo ARCH=$(TARCH) 1> ../config.mak
 	@echo TARGETOS=Windows  1>> ../config.mak
 	@echo CONFIG_WIN32=yes 1>> ../config.mak
 	@echo TOPSRC=$$\(TOP\) 1>> ../config.mak
diff --git a/win32/include/_mingw.h b/win32/include/_mingw.h
index 2e565a64..9a8696d0 100644
--- a/win32/include/_mingw.h
+++ b/win32/include/_mingw.h
@@ -139,6 +139,18 @@ typedef struct localeinfo_struct _locale_tstruct,*_locale_t;
 #define NOSERVICE 1
 #define NOMCX 1
 #define NOIME 1
+#define __INTRIN_H_
+#ifndef DUMMYUNIONNAME
+#  define DUMMYUNIONNAME
+#  define DUMMYUNIONNAME1
+#  define DUMMYUNIONNAME2
+#  define DUMMYUNIONNAME3
+#  define DUMMYUNIONNAME4
+#  define DUMMYUNIONNAME5
+#endif
+#ifndef DUMMYSTRUCTNAME
+#  define DUMMYSTRUCTNAME
+#endif
 #ifndef WINVER
 # define WINVER 0x0502
 #endif
diff --git a/win32/lib/crt1.c b/win32/lib/crt1.c
index a9b1a300..2cb25c00 100644
--- a/win32/lib/crt1.c
+++ b/win32/lib/crt1.c
@@ -73,15 +73,18 @@ int _runtmain(int argc, /* as tcc passed in */ char **argv)
     _startupinfo start_info = {0};
 
     __tgetmainargs(&wargc, &wargv, &wenv, _dowildcard, &start_info);
+    /* may be wrong when tcc has received wildcards (*.c) */
     if (argc < wargc)
         wargv += wargc - argc;
+    else
+        argc = wargc;
 #define argv wargv
 #endif
 
 #ifdef __i386
     _controlfp(_PC_53, _MCW_PC);
 #endif
-    return _tmain(argc, argv, NULL);
+    return _tmain(argc, argv, _tenviron);
 }
 
 // =============================================
diff --git a/win32/lib/user32.def b/win32/lib/user32.def
index 4d2f704e..a034dac2 100644
--- a/win32/lib/user32.def
+++ b/win32/lib/user32.def
@@ -336,6 +336,10 @@ GetWindow
 GetWindowContextHelpId
 GetWindowDC
 GetWindowInfo
+GetWindowLongPtrA
+GetWindowLongPtrW
+SetWindowLongPtrA
+SetWindowLongPtrW
 GetWindowLongA
 GetWindowLongW
 GetWindowModuleFileNameA
diff --git a/win32/lib/wincrt1.c b/win32/lib/wincrt1.c
index a4197bb9..0a5036eb 100644
--- a/win32/lib/wincrt1.c
+++ b/win32/lib/wincrt1.c
@@ -80,6 +80,8 @@ int _runtwinmain(int argc, /* as tcc passed in */ char **argv)
     __tgetmainargs(&wargc, &wargv, &wenv, 0, &start_info);
     if (argc < wargc)
         wargv += wargc - argc;
+    else
+        argc = wargc;
 #define argv wargv
 #endif