diff --git a/CMakeLists.txt b/CMakeLists.txt index 2598d386b7..14b490fa54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -365,7 +365,7 @@ if(ZIG_STATIC) endif() else() if(MINGW) - set(EXE_LDFLAGS "${EXE_LDFLAGS} -lz3") + set(EXE_LDFLAGS "${EXE_LDFLAGS}") endif() endif() @@ -429,11 +429,6 @@ if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") else() set(LIBSTAGE2_RELEASE_ARG --release-fast --strip) endif() -if(WIN32) - set(LIBSTAGE2_WINDOWS_ARGS "-lntdll") -else() - set(LIBSTAGE2_WINDOWS_ARGS "") -endif() set(BUILD_LIBSTAGE2_ARGS "build-lib" "src-self-hosted/stage2.zig" @@ -447,7 +442,6 @@ set(BUILD_LIBSTAGE2_ARGS "build-lib" --bundle-compiler-rt -fPIC -lc - ${LIBSTAGE2_WINDOWS_ARGS} ) if("${ZIG_TARGET_TRIPLE}" STREQUAL "native") diff --git a/cmake/Findllvm.cmake b/cmake/Findllvm.cmake index 6819c23ee5..12e1ff7eb0 100644 --- a/cmake/Findllvm.cmake +++ b/cmake/Findllvm.cmake @@ -144,9 +144,7 @@ else() /mingw64/lib /c/msys64/mingw64/lib c:\\msys64\\mingw64\\lib) - if(LLVM_${_prettylibname_}_LIB) - set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB}) - endif() + set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_${_prettylibname_}_LIB}) endmacro(FIND_AND_ADD_LLVM_LIB) # This list can be re-generated with `llvm-config --libfiles` and then @@ -154,7 +152,6 @@ else() # `llvm-config` here because we are cross compiling. FIND_AND_ADD_LLVM_LIB(LLVMXRay) FIND_AND_ADD_LLVM_LIB(LLVMWindowsManifest) - FIND_AND_ADD_LLVM_LIB(LLVMTableGen) FIND_AND_ADD_LLVM_LIB(LLVMSymbolize) FIND_AND_ADD_LLVM_LIB(LLVMDebugInfoPDB) FIND_AND_ADD_LLVM_LIB(LLVMOrcJIT) diff --git a/lib/libc/mingw/lib32/version.def b/lib/libc/mingw/lib32/version.def new file mode 100644 index 0000000000..35a087e5dc --- /dev/null +++ b/lib/libc/mingw/lib32/version.def @@ -0,0 +1,16 @@ +LIBRARY "VERSION.dll" +EXPORTS +GetFileVersionInfoA@16 +GetFileVersionInfoSizeA@8 +GetFileVersionInfoSizeW@8 +GetFileVersionInfoW@16 +VerFindFileA@32 +VerFindFileW@32 +VerInstallFileA@32 +VerInstallFileW@32 +VerLanguageNameA@12 +VerLanguageNameW@12 +VerQueryValueA@16 +VerQueryValueIndexA@24 +VerQueryValueIndexW@24 +VerQueryValueW@16 diff --git a/lib/libc/mingw/misc/___mb_cur_max_func.c b/lib/libc/mingw/misc/___mb_cur_max_func.c new file mode 100644 index 0000000000..61dcdb7a66 --- /dev/null +++ b/lib/libc/mingw/misc/___mb_cur_max_func.c @@ -0,0 +1,18 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ + +#include <_mingw.h> + +extern int* __MINGW_IMP_SYMBOL(__mb_cur_max); + +int __cdecl ___mb_cur_max_func(void); +int __cdecl ___mb_cur_max_func(void) +{ + return *__MINGW_IMP_SYMBOL(__mb_cur_max); +} + +typedef int __cdecl (*_f___mb_cur_max_func)(void); +_f___mb_cur_max_func __MINGW_IMP_SYMBOL(___mb_cur_max_func) = ___mb_cur_max_func; diff --git a/src/all_types.hpp b/src/all_types.hpp index 9b22279b91..650dcfd0c7 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -2259,6 +2259,7 @@ struct CodeGen { size_t version_minor; size_t version_patch; const char *linker_script; + size_t stack_size_override; BuildMode build_mode; OutType out_type; diff --git a/src/codegen.cpp b/src/codegen.cpp index a2cd5fafc0..7de26e0b6d 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -10597,6 +10597,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { cache_int(ch, g->linker_allow_shlib_undefined); cache_bool(ch, g->linker_z_nodelete); cache_bool(ch, g->linker_z_defs); + cache_usize(ch, g->stack_size_override); // gen_c_objects appends objects to g->link_objects which we want to include in the hash gen_c_objects(g); diff --git a/src/link.cpp b/src/link.cpp index 4ee8915e55..0c02837630 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -72,7 +72,7 @@ static const char *msvcrt_common_src[] = { static const char *msvcrt_i386_src[] = { "misc" OS_SEP "lc_locale_func.c", - + "misc" OS_SEP "___mb_cur_max_func.c", }; static const char *msvcrt_other_src[] = { @@ -1840,7 +1840,8 @@ static void construct_linker_job_elf(LinkJob *lj) { if (g->out_type == OutTypeExe) { lj->args.append("-z"); - lj->args.append("stack-size=16777216"); // default to 16 MiB + size_t stack_size = (g->stack_size_override == 0) ? 16777216 : g->stack_size_override; + lj->args.append(buf_ptr(buf_sprintf("stack-size=%" ZIG_PRI_usize, stack_size))); } if (g->linker_script) { @@ -2479,7 +2480,8 @@ static void construct_linker_job_coff(LinkJob *lj) { if (g->out_type == OutTypeExe) { // TODO compile time stack upper bound detection - lj->args.append("-STACK:16777216"); + size_t stack_size = (g->stack_size_override == 0) ? 16777216 : g->stack_size_override; + lj->args.append(buf_ptr(buf_sprintf("-STACK:%" ZIG_PRI_usize, stack_size))); } coff_append_machine_arg(g, &lj->args); diff --git a/src/main.cpp b/src/main.cpp index a2d7577a74..8805382f37 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -453,6 +453,7 @@ static int main0(int argc, char **argv) { OptionalBool linker_allow_shlib_undefined = OptionalBoolNull; bool linker_z_nodelete = false; bool linker_z_defs = false; + size_t stack_size_override = 0; ZigList llvm_argv = {0}; llvm_argv.append("zig (LLVM option parsing)"); @@ -848,6 +849,27 @@ static int main0(int argc, char **argv) { } else { fprintf(stderr, "warning: unsupported linker arg: -z %s\n", buf_ptr(z_arg)); } + } else if (buf_eql_str(arg, "--major-image-version")) { + i += 1; + if (i >= linker_args.length) { + fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg)); + return EXIT_FAILURE; + } + ver_major = atoi(buf_ptr(linker_args.at(i))); + } else if (buf_eql_str(arg, "--minor-image-version")) { + i += 1; + if (i >= linker_args.length) { + fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg)); + return EXIT_FAILURE; + } + ver_minor = atoi(buf_ptr(linker_args.at(i))); + } else if (buf_eql_str(arg, "--stack")) { + i += 1; + if (i >= linker_args.length) { + fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg)); + return EXIT_FAILURE; + } + stack_size_override = atoi(buf_ptr(linker_args.at(i))); } else { fprintf(stderr, "warning: unsupported linker arg: %s\n", buf_ptr(arg)); } @@ -1573,6 +1595,7 @@ static int main0(int argc, char **argv) { g->linker_allow_shlib_undefined = linker_allow_shlib_undefined; g->linker_z_nodelete = linker_z_nodelete; g->linker_z_defs = linker_z_defs; + g->stack_size_override = stack_size_override; if (override_soname) { g->override_soname = buf_create_from_str(override_soname); diff --git a/src/os.cpp b/src/os.cpp index 505063f827..16d6847d4e 100644 --- a/src/os.cpp +++ b/src/os.cpp @@ -37,7 +37,9 @@ #include #include +#if defined(_MSC_VER) typedef SSIZE_T ssize_t; +#endif #else #define ZIG_OS_POSIX diff --git a/src/zig_clang.h b/src/zig_clang.h index f938d8b56e..272064a0ef 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -50,7 +50,9 @@ enum ZigClangAPValueKind { struct ZigClangAPValue { enum ZigClangAPValueKind Kind; // experimentally-derived size of clang::APValue::DataType -#if defined(_WIN32) && defined(_MSC_VER) +#if defined(_WIN32) && defined(__i386__) + char Data[68]; +#elif defined(_WIN32) && defined(_MSC_VER) char Data[52]; #elif defined(__i386__) char Data[48];