From 872825fb57a678a24dee61cc727fe2e6cc4be41d Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Fri, 18 May 2018 18:42:14 +0800 Subject: [PATCH] Add Windows support. (#2306) JerryScript-DCO-1.0-Signed-off-by: PKarics karicska@gmail.com JerryScript-DCO-1.0-Signed-off-by: Yonggang Luo luoyonggang@gmail.com --- .gitignore | 1 + CMakeLists.txt | 28 +++++++++++++++-- appveyor.yml | 30 +++++++++++++++++++ jerry-core/CMakeLists.txt | 4 +-- .../ecma-builtin-helpers-date.c | 2 +- .../builtin-objects/ecma-builtin-helpers.c | 2 +- jerry-core/ecma/operations/ecma-objects.c | 10 ++++--- jerry-core/include/jerryscript-compiler.h | 22 ++++++++++++++ jerry-core/vm/vm.c | 2 +- jerry-ext/arg/arg.c | 4 +-- jerry-ext/module/module.c | 4 +-- jerry-main/main-unix.c | 6 ++-- 12 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 appveyor.yml diff --git a/.gitignore b/.gitignore index 6517d250c..4fbe2fe2a 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ docs/doxygen # Tests tests/test262/ tests/unit-doc/*.c +.vs diff --git a/CMakeLists.txt b/CMakeLists.txt index 90329e2a9..6de1ad524 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,10 @@ if(CMAKE_C_COMPILER_ID MATCHES "TI") set(USING_TI 1) endif() +if(CMAKE_C_COMPILER_ID MATCHES "MSVC") + set(USING_MSVC 1) +endif() + # Determining build type if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "MinSizeRel") @@ -94,8 +98,21 @@ if(USING_TI) set(ENABLE_STRIP_MESSAGE " (FORCED BY COMPILER)") endif() +if(USING_MSVC) + set(JERRY_LIBC OFF) + set(JERRY_LIBM OFF) + set(ENABLE_ALL_IN_ONE ON) + set(ENABLE_STRIP OFF) + + set(JERRY_LIBC_MESSAGE " (FORCED BY COMPILER)") + set(JERRY_LIBM_MESSAGE " (FORCED BY COMPILER)") + set(ENABLE_ALL_IN_ONE_MESSAGE " (FORCED BY COMPILER)") + set(ENABLE_STRIP_MESSAGE " (FORCED BY COMPILER)") +endif() + # Status messages message(STATUS "CMAKE_BUILD_TYPE " ${CMAKE_BUILD_TYPE}) +message(STATUS "CMAKE_C_COMPILER_ID " ${CMAKE_C_COMPILER_ID}) message(STATUS "CMAKE_SYSTEM_NAME " ${CMAKE_SYSTEM_NAME}) message(STATUS "CMAKE_SYSTEM_PROCESSOR " ${CMAKE_SYSTEM_PROCESSOR}) message(STATUS "ENABLE_ALL_IN_ONE " ${ENABLE_ALL_IN_ONE} ${ENABLE_ALL_IN_ONE_MESSAGE}) @@ -190,7 +207,7 @@ if(("${PLATFORM}" STREQUAL "DARWIN")) jerry_add_link_flags(-lSystem) set(CMAKE_C_ARCHIVE_CREATE " Sqc ") set(CMAKE_C_ARCHIVE_FINISH " -no_warning_for_no_symbols -c ") -else() +elseif(NOT USING_MSVC) jerry_add_link_flags(-Wl,-z,noexecstack) endif() @@ -199,9 +216,16 @@ if(JERRY_LIBC) jerry_add_link_flags(-nostdlib) endif() +if(USING_MSVC) + jerry_add_link_flags(/OPT:NOREF) + # Disable MSVC warning 4996 globally because it stops us from using + # standard C functions. + jerry_add_compile_flags(/wd4996) +endif() + # Turn off stack protector if (USING_GCC OR USING_CLANG) -jerry_add_compile_flags(-fno-stack-protector) + jerry_add_compile_flags(-fno-stack-protector) endif() if (USING_GCC OR USING_CLANG) diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..c019a15e6 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,30 @@ +version: 1.0.{build} +pull_requests: + do_not_increment_build_number: true +branches: + except: + - coverity_scan + - gh_pages +skip_tags: true +image: + - Visual Studio 2017 +configuration: + - Debug + - Release +platform: + - x64 + - Win32 +init: + - cmd: | + cmake -version +before_build: + - cmd: | + mkdir build + cd build + if "%PLATFORM%"=="Win32" cmake -G"Visual Studio 15 2017" .. + if "%PLATFORM%"=="x64" cmake -G"Visual Studio 15 2017 Win64" .. + +build: + project: build\Jerry.sln + parallel: true + verbosity: minimal diff --git a/jerry-core/CMakeLists.txt b/jerry-core/CMakeLists.txt index dff2438d0..4056a2fb0 100644 --- a/jerry-core/CMakeLists.txt +++ b/jerry-core/CMakeLists.txt @@ -146,9 +146,7 @@ endif() set(INCLUDE_THIRD_PARTY_VALGRIND "${CMAKE_SOURCE_DIR}/third-party/valgrind") # build mode specific compile/link flags -if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") - set(DEFINES_JERRY ${DEFINES_JERRY} JERRY_NDEBUG) -endif() +set(DEFINES_JERRY ${DEFINES_JERRY} $<$>:JERRY_NDEBUG>) # Jerry heap-section if(DEFINED JERRY_HEAP_SECTION_ATTR) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c index f0820071d..a5b161b63 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c @@ -639,7 +639,7 @@ ecma_date_to_string_format (ecma_number_t datetime_number, /**< datetime */ }; const uint32_t date_buffer_length = 34; - lit_utf8_byte_t date_buffer[date_buffer_length]; + JERRY_VLA (lit_utf8_byte_t, date_buffer, date_buffer_length); lit_utf8_byte_t *dest_p = date_buffer; diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c index 506c03e2d..7af602b8d 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c @@ -84,7 +84,7 @@ ecma_builtin_helper_object_to_string (const ecma_value_t this_arg) /**< this arg 'Null' or one of possible object's classes. The string with null character is maximum 27 characters long. */ const lit_utf8_size_t buffer_size = 27; - lit_utf8_byte_t str_buffer[buffer_size]; + JERRY_VLA (lit_utf8_byte_t, str_buffer, buffer_size); lit_utf8_byte_t *buffer_ptr = str_buffer; diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 80eff86f4..f7f223ff9 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -1365,9 +1365,10 @@ ecma_op_object_get_property_names (ecma_object_t *obj_p, /**< object */ const bool obj_is_builtin = ecma_get_object_is_builtin (obj_p); const size_t bitmap_row_size = sizeof (uint32_t) * JERRY_BITSINBYTE; - uint32_t names_hashes_bitmap[ECMA_OBJECT_HASH_BITMAP_SIZE / bitmap_row_size]; + const size_t names_hashes_bitmap_size = ECMA_OBJECT_HASH_BITMAP_SIZE / bitmap_row_size; + JERRY_VLA (uint32_t, names_hashes_bitmap, names_hashes_bitmap_size); - memset (names_hashes_bitmap, 0, sizeof (names_hashes_bitmap)); + memset (names_hashes_bitmap, 0, names_hashes_bitmap_size * sizeof (names_hashes_bitmap[0])); for (ecma_object_t *prototype_chain_iter_p = obj_p; prototype_chain_iter_p != NULL; @@ -1461,8 +1462,9 @@ ecma_op_object_get_property_names (ecma_object_t *obj_p, /**< object */ ecma_value_t *ecma_value_p = ecma_collection_iterator_init (prop_names_p); - uint32_t own_names_hashes_bitmap[ECMA_OBJECT_HASH_BITMAP_SIZE / bitmap_row_size]; - memset (own_names_hashes_bitmap, 0, sizeof (own_names_hashes_bitmap)); + const size_t own_names_hashes_bitmap_size = ECMA_OBJECT_HASH_BITMAP_SIZE / bitmap_row_size; + JERRY_VLA (uint32_t, own_names_hashes_bitmap, own_names_hashes_bitmap_size); + memset (own_names_hashes_bitmap, 0, own_names_hashes_bitmap_size * sizeof (own_names_hashes_bitmap[0])); while (ecma_value_p != NULL) { diff --git a/jerry-core/include/jerryscript-compiler.h b/jerry-core/include/jerryscript-compiler.h index a7ecc93d4..6ac30b814 100644 --- a/jerry-core/include/jerryscript-compiler.h +++ b/jerry-core/include/jerryscript-compiler.h @@ -47,6 +47,24 @@ extern "C" #endif /* __GNUC__ */ +#ifdef _MSC_VER + +/* + * Compiler-specific macros relevant for Microsoft Visual C/C++ Compiler. + */ +#define JERRY_ATTR_DEPRECATED __declspec(deprecated) +#define JERRY_ATTR_NOINLINE __declspec(noinline) +#define JERRY_ATTR_NORETURN __declspec(noreturn) + +/* + * Microsoft Visual C/C++ Compiler doesn't support for VLA, using _alloca + * instead. + */ +void * __cdecl _alloca (size_t _Size); +#define JERRY_VLA(type, name, size) type *name = (type *) (_alloca (sizeof (type) * size)) + +#endif /* _MSC_VER */ + /* * Default empty definitions for all compiler-specific macros. Define any of * these in a guarded block above (e.g., as for GCC) to fine tune compilation @@ -110,6 +128,10 @@ extern "C" #define JERRY_UNLIKELY(x) (x) #endif /* !JERRY_UNLIKELY */ +#ifndef JERRY_VLA +#define JERRY_VLA(type, name, size) type name[size] +#endif /* !JERRY_VLA */ + /** * @} */ diff --git a/jerry-core/vm/vm.c b/jerry-core/vm/vm.c index 6cb0d8a55..8ce591c42 100644 --- a/jerry-core/vm/vm.c +++ b/jerry-core/vm/vm.c @@ -3081,7 +3081,7 @@ vm_run (const ecma_compiled_code_t *bytecode_header_p, /**< byte-code data heade frame_ctx.call_operation = VM_NO_EXEC_OP; /* Use JERRY_MAX() to avoid array declaration with size 0. */ - ecma_value_t stack[JERRY_MAX (call_stack_size, 1)]; + JERRY_VLA (ecma_value_t, stack, JERRY_MAX (call_stack_size, 1)); frame_ctx.registers_p = stack; return vm_execute (&frame_ctx, arg_list_p, arg_list_len); diff --git a/jerry-ext/arg/arg.c b/jerry-ext/arg/arg.c index e62a897c9..9239106ba 100644 --- a/jerry-ext/arg/arg.c +++ b/jerry-ext/arg/arg.c @@ -115,7 +115,7 @@ jerryx_arg_transform_object_properties (const jerry_value_t obj_val,/**< the JS return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "Not an object."); } - jerry_value_t prop[name_cnt]; + JERRY_VLA (jerry_value_t, prop, name_cnt); for (jerry_length_t i = 0; i < name_cnt; i++, name_p++) { @@ -160,7 +160,7 @@ jerryx_arg_transform_array (const jerry_value_t array_val, /**< points to the JS return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "Not an array."); } - jerry_value_t arr[c_arg_cnt]; + JERRY_VLA (jerry_value_t, arr, c_arg_cnt); for (jerry_length_t i = 0; i < c_arg_cnt; i++) { diff --git a/jerry-ext/module/module.c b/jerry-ext/module/module.c index 2593735c7..fa972b7ea 100644 --- a/jerry-ext/module/module.c +++ b/jerry-ext/module/module.c @@ -176,7 +176,7 @@ jerryx_resolve_native_module (const jerry_value_t canonical_name, /**< canonical const jerryx_native_module_t *module_p = NULL; jerry_size_t name_size = jerry_get_utf8_string_size (canonical_name); - jerry_char_t name_string[name_size]; + JERRY_VLA (jerry_char_t, name_string, name_size); jerry_string_to_utf8_char_buffer (canonical_name, name_string, name_size); /* Look for the module by its name in the list of module definitions. */ @@ -214,7 +214,7 @@ jerryx_module_resolve_local (const jerry_value_t name, /**< name of the module t size_t index; size_t canonical_names_used = 0; jerry_value_t instances; - jerry_value_t canonical_names[resolver_count]; + JERRY_VLA (jerry_value_t, canonical_names, resolver_count); jerry_value_t (*get_canonical_name_p) (const jerry_value_t name); bool (*resolve_p) (const jerry_value_t canonical_name, jerry_value_t *result); diff --git a/jerry-main/main-unix.c b/jerry-main/main-unix.c index 3ee55955d..d7dd3925a 100644 --- a/jerry-main/main-unix.c +++ b/jerry-main/main-unix.c @@ -417,13 +417,13 @@ main (int argc, char **argv) { srand ((unsigned) jerry_port_get_current_time ()); - const char *file_names[argc]; + JERRY_VLA (const char *, file_names, argc); int files_counter = 0; jerry_init_flag_t flags = JERRY_INIT_EMPTY; - const char *exec_snapshot_file_names[argc]; - uint32_t exec_snapshot_file_indices[argc]; + JERRY_VLA (const char *, exec_snapshot_file_names, argc); + JERRY_VLA (uint32_t, exec_snapshot_file_indices, argc); int exec_snapshots_count = 0; bool is_parse_only = false;