diff --git a/CMakeLists.txt b/CMakeLists.txt index bb1128f8f..347f35968 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,13 +37,37 @@ project (Jerry CXX C ASM) set(CMAKE_AR ${DIRECTORY_GCC}/${CMAKE_AR}) set(CMAKE_RANLIB ${DIRECTORY_GCC}/${CMAKE_RANLIB}) +# Disable _FORTIFY_SOURCE + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U_FORTIFY_SOURCE") + +# Architecture-specific compile/link flags + foreach(FLAG ${FLAGS_COMMON_ARCH}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}") + endforeach() + # Remove rdynamic option set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS ) set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS ) -# Options - option(STRIP_LINUX_RELEASE_BINARY "Strip symbols from Linux-targeted release binaries" ON) - set(MCU_SCRIPT_FILE "tests/blinky.js" CACHE STRING "Script to run on MCU") +# Determining platform and defining options + set(PLATFORM "${CMAKE_SYSTEM_NAME}") + string(TOUPPER "${PLATFORM}" PLATFORM) + + if("${PLATFORM}" STREQUAL "LINUX") + set(PLATFORM_EXT "LINUX") + + option(STRIP_RELEASE_BINARY "Strip symbols from release binaries" ON) + elseif("${PLATFORM}" STREQUAL "MCU") + set(PLATFORM_EXT "MCU_${CMAKE_SYSTEM_VERSION}") + + option(STRIP_RELEASE_BINARY "Strip symbols from release binaries" OFF) + set(MCU_SCRIPT_FILE "tests/blinky.js" CACHE STRING "Script to run on MCU") + else() + message(FATAL_ERROR "Platform is not supported") + endif() # Intermediate files # Script to run on MCU @@ -68,297 +92,105 @@ project (Jerry CXX C ASM) # Profiles # Full profile (default, so - no suffix) - set(MODIFIER_SUFFIX_FULL_PROFILE ) - set(MODIFIER_DEFINES_FULL_PROFILE DEFINES_JERRY_FULL_PROFILE) - set(MODIFIER_INCLUDE_FULL_PROFILE ) + set(MODIFIER_SUFFIX_FULL_PROFILE "") # Compact profile set(MODIFIER_SUFFIX_COMPACT_PROFILE -cp) - set(MODIFIER_DEFINES_COMPACT_PROFILE DEFINES_JERRY_COMPACT_PROFILE) - set(MODIFIER_INCLUDE_COMPACT_PROFILE ) # Minimal compact profile set(MODIFIER_SUFFIX_COMPACT_PROFILE_MINIMAL -cp_minimal) - set(MODIFIER_DEFINES_COMPACT_PROFILE_MINIMAL DEFINES_JERRY_COMPACT_PROFILE_MINIMAL) - set(MODIFIER_INCLUDE_COMPACT_PROFILE_MINIMAL ) # Memory statistics set(MODIFIER_SUFFIX_MEMORY_STATISTICS -mem_stats) - set(MODIFIER_DEFINES_MEMORY_STATISTICS DEFINES_JERRY_MEMORY_STATS) - set(MODIFIER_INCLUDE_MEMORY_STATISTICS ) - # Valgrind - set(MODIFIER_SUFFIX_VALGRIND -valgrind) - set(MODIFIER_DEFINES_VALGRIND DEFINES_JERRY_VALGRIND) - set(MODIFIER_INCLUDE_VALGRIND INCLUDE_THIRD_PARTY_VALGRIND) + # Valgrind (TODO: make option) +# set(MODIFIER_SUFFIX_VALGRIND -valgrind) +# set(MODIFIER_DEFINES_VALGRIND DEFINES_JERRY_VALGRIND) +# set(MODIFIER_INCLUDE_VALGRIND INCLUDE_THIRD_PARTY_VALGRIND) -# Compiler flags - set(CXX_FLAGS_JERRY -std=c++11 -fno-exceptions -fno-rtti) +# Modifier lists + # Linux + set(MODIFIERS_LISTS_LINUX + "FULL_PROFILE" + "COMPACT_PROFILE" + "COMPACT_PROFILE_MINIMAL" + "FULL_PROFILE MEMORY_STATISTICS" + "COMPACT_PROFILE_MINIMAL MEMORY_STATISTICS") - # Turn off implicit template instantiation - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -fno-implicit-templates -fno-implicit-inline-templates) + # MCU + # stm32f3 + set(MODIFIERS_LISTS_MCU_STM32F3 + "FULL_PROFILE" + "COMPACT_PROFILE" + "COMPACT_PROFILE_MINIMAL") + + # stm32f4 + set(MODIFIERS_LISTS_MCU_STM32F4 + "FULL_PROFILE" + "COMPACT_PROFILE" + "COMPACT_PROFILE_MINIMAL") + +# Compiler / Linker flags + set(COMPILE_FLAGS_JERRY "-fno-builtin") + set(LINKER_FLAGS_COMMON "-nostdlib") # Turn off stack protector - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -fno-stack-protector) + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -fno-stack-protector") # Debug information - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -g -gdwarf-4) + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -g -gdwarf-4") # Warnings - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -Wall -Wextra -Wpedantic -Wlogical-op) - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -Wformat-nonliteral -Winit-self -Wstack-protector) - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -Wconversion -Wsign-conversion -Wformat-security) - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -Wmissing-declarations -Wno-attributes) - set(CXX_FLAGS_JERRY ${CXX_FLAGS_JERRY} -Werror -Wfatal-errors) - - # Architecture-specific - # x86_64 - # Workaround for gcc bug 64905 (x86_64) - set(CXX_FLAGS_JERRY_X86_64 -ffixed-rbp) - - # ARMv7 - set(CXX_FLAGS_JERRY_ARMV7 -mlittle-endian -mthumb) - - # Platform-specific - # MCU - # stm32f3 - set(CXX_FLAGS_COMMON_MCU_STM32F3 -mcpu=cortex-m4 -march=armv7e-m) - set(CXX_FLAGS_COMMON_MCU_STM32F3 ${CXX_FLAGS_COMMON_MCU_STM32F3} -mfpu=fpv4-sp-d16 -mfloat-abi=hard) - # stm32f4 - set(CXX_FLAGS_COMMON_MCU_STM32F4 -mcpu=cortex-m4 -march=armv7e-m) - set(CXX_FLAGS_COMMON_MCU_STM32F4 ${CXX_FLAGS_COMMON_MCU_STM32F4} -mfpu=fpv4-sp-d16 -mfloat-abi=hard) - - # Debug - set(CXX_FLAGS_COMMON_DEBUG ) - - # Release - set(CXX_FLAGS_COMMON_RELEASE -Os -flto) - - # Unit tests - set(CXX_FLAGS_UNIT_TEST - ${CXX_FLAGS_COMMON_RELEASE}) - -# Linker flags (flags are passed through set_target_properties, -# so they should be specified withstring constant, -# not list) - set(LINKER_FLAGS_JERRY "-nostdlib -lgcc") + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wall -Wextra -Wpedantic -Wlogical-op") + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wformat-nonliteral -Winit-self -Wno-stack-protector") + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wconversion -Wsign-conversion -Wformat-security") + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Wmissing-declarations -Wno-attributes") + set(COMPILE_FLAGS_JERRY "${COMPILE_FLAGS_JERRY} -Werror -Wfatal-errors") # Static build - set(LINKER_FLAGS_STATIC "-static") + set(LINKER_FLAGS_STATIC "-static") - # Architecture-specific - # x86_64 - # Workaround for gcc bug 64905 (x86_64) - string(REPLACE ";" " " LINKER_FLAGS_JERRY_X86_64 "${CXX_FLAGS_JERRY_X86_64}") + # C++ + set(CXX_FLAGS_JERRY "-std=c++11 -fno-exceptions -fno-rtti") - # ARMv7 - string(REPLACE ";" " " LINKER_FLAGS_JERRY_ARMV7 "${CXX_FLAGS_JERRY_ARMV7}") + # Turn off implicit template instantiation + set(CXX_FLAGS_JERRY "${CXX_FLAGS_JERRY} -fno-implicit-templates -fno-implicit-inline-templates") -# Platform-specific - # MCU - # stm32f3 - set(LINKER_FLAGS_JERRY_MCU_STM32F3 "-T${CMAKE_SOURCE_DIR}/third-party/stm32f3.ld") - # stm32f4 - set(LINKER_FLAGS_JERRY_MCU_STM32F4 "-T${CMAKE_SOURCE_DIR}/third-party/stm32f4.ld") - - # Debug - set(LINKER_FLAGS_COMMON_DEBUG "") - - # Release - set(LINKER_FLAGS_COMMON_RELEASE "-Os -flto") - - # Unit tests - set(LINKER_FLAGS_UNIT_TEST - "${LINKER_FLAGS_COMMON_RELEASE}") - -# Definitions - # Common - # Get version information from git - execute_process(COMMAND git symbolic-ref -q HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE JERRY_GIT_BRANCH - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND git rev-parse HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE JERRY_GIT_COMMIT - OUTPUT_STRIP_TRAILING_WHITESPACE) - # Get build date - execute_process(COMMAND date +%d/%m/%Y - OUTPUT_VARIABLE JERRY_BUILD_DATE - OUTPUT_STRIP_TRAILING_WHITESPACE) - - set(DEFINES_JERRY - JERRY_BUILD_DATE="${JERRY_BUILD_DATE}" - JERRY_COMMIT_HASH="${JERRY_GIT_COMMIT}" - JERRY_BRANCH_NAME="${JERRY_GIT_BRANCH}") - - # Debug - set(DEFINES_JERRY_DEBUG JERRY_ENABLE_PRETTY_PRINTER) - - # Release - set(DEFINES_JERRY_RELEASE JERRY_NDEBUG) - - # Full profile - set(DEFINES_JERRY_FULL_PROFILE CONFIG_ECMA_NUMBER_TYPE=CONFIG_ECMA_NUMBER_FLOAT64) - - # Compact profile - set(DEFINES_JERRY_COMPACT_PROFILE - CONFIG_ECMA_COMPACT_PROFILE) - - # Minimal compact profile - set(DEFINES_JERRY_COMPACT_PROFILE_MINIMAL - CONFIG_ECMA_COMPACT_PROFILE - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_STRING_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ERROR_BUILTINS - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ARRAY_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_MATH_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_DATE_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_JSON_BUILTIN - CONFIG_ECMA_COMPACT_PROFILE_DISABLE_REGEXP_BUILTIN) - - # Memory statistics - set(DEFINES_JERRY_MEMORY_STATS MEM_STATS) - - # Valgrind - set(DEFINES_JERRY_VALGRIND JERRY_VALGRIND) - - # Architecture-specific - # x86_64 - set(DEFINES_JERRY_X86_64 __TARGET_HOST_x64) - # ARMv7 - set(DEFINES_JERRY_ARMV7 __TARGET_HOST_ARMv7) + # C + set(C_FLAGS_JERRY "-std=c99") # Platform-specific - # Linux - set(DEFINES_JERRY_LINUX __TARGET_HOST JERRY_SOURCE_BUFFER_SIZE=1048576) # MCU - math(EXPR MEM_HEAP_AREA_SIZE_16K "16 * 1024") - set(DEFINES_JERRY_MCU CONFIG_MEM_HEAP_AREA_SIZE=${MEM_HEAP_AREA_SIZE_16K} __TARGET_MCU) # stm32f3 - set(DEFINES_JERRY_MCU_STM32F3 __TARGET_MCU_STM32F3) + set(LINKER_FLAGS_COMMON_MCU_STM32F3 "-T${CMAKE_SOURCE_DIR}/third-party/stm32f3.ld") # stm32f4 - set(DEFINES_JERRY_MCU_STM32F4 __TARGET_MCU_STM32F4) + set(LINKER_FLAGS_COMMON_MCU_STM32F4 "-T${CMAKE_SOURCE_DIR}/third-party/stm32f4.ld") + + # Debug + set(FLAGS_COMMON_DEBUG "") + + # Release + set(FLAGS_COMMON_RELEASE "-Os -flto") # Unit tests - set(DEFINES_UNIT_TEST - ${DEFINES_JERRY_FULL_PROFILE} - ${DEFINES_JERRY_DEBUG} - ${DEFINES_JERRY_VALGRIND}) + set(FLAGS_UNIT_TEST "${FLAGS_COMMON_RELEASE}") # Include directories set(INCLUDE_CORE - src - src/mem - src/vm - src/ecma/builtin-objects - src/ecma/base - src/ecma/operations - src/parser/collections - src/parser/js - src/jrt - jerry-libc - plugins/lib-device-stm) - - # Platform-specific - # Linux - set(INCLUDE_CORE_LINUX - jerry-libc/target/linux) - # MCU - # STM32F3 - set(INCLUDE_CORE_MCU_STM32F3 - jerry-libc/target/stm32f3) - # STM32F4 - set(INCLUDE_CORE_MCU_STM32F4 - jerry-libc/target/stm32f4) - - # Third-party - # Valgrind - set(INCLUDE_THIRD_PARTY_VALGRIND third-party/valgrind) - - # Platform-specific - # MCU - # STM32F3 - set(INCLUDE_THIRD_PARTY_MCU_STM32F3 - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Include - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/inc - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Include - third-party/STM32F3-Discovery_FW_V1.1.0) - # STM32F4 - set(INCLUDE_THIRD_PARTY_MCU_STM32F4 - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/inc - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include - third-party/STM32F4-Discovery_FW_V1.1.0) - - # Unit tests - set(INCLUDE_UNIT_TEST - tests/unit - ${INCLUDE_THIRD_PARTY_VALGRIND}) + ${CMAKE_SOURCE_DIR}/src) # Sources - # Jerry core - file(GLOB SOURCE_CORE_MEM src/mem/*.cpp) - file(GLOB SOURCE_CORE_VM src/vm/*.cpp) - file(GLOB SOURCE_CORE_ECMA_BUILTINS src/ecma/builtin-objects/*.cpp) - file(GLOB SOURCE_CORE_ECMA_BASE src/ecma/base/*.cpp) - file(GLOB SOURCE_CORE_ECMA_OPERATIONS src/ecma/operations/*.cpp) - file(GLOB SOURCE_CORE_PARSER_COLLECTIONS src/parser/collections/*.cpp) - file(GLOB SOURCE_CORE_PARSER_JS src/parser/js/*.cpp) - file(GLOB SOURCE_CORE_JRT src/jrt/*.cpp) - - # libc - file(GLOB SOURCE_JERRY_LIBC jerry-libc/*.cpp) - - # Plugins - file(GLOB SOURCE_PLUGINS_LIB_DEVICE_STM plugins/lib-device-stm/*.cpp) - - set(SOURCE_CORE - src/jerry.cpp - ${SOURCE_CORE_MEM} - ${SOURCE_CORE_VM} - ${SOURCE_CORE_ECMA_BUILTINS} - ${SOURCE_CORE_ECMA_BASE} - ${SOURCE_CORE_ECMA_OPERATIONS} - ${SOURCE_CORE_PARSER_COLLECTIONS} - ${SOURCE_CORE_PARSER_JS} - ${SOURCE_CORE_JRT} - ${SOURCE_JERRY_LIBC} - ${SOURCE_PLUGINS_LIB_DEVICE_STM}) - # Platform-specific - # Linux - # Jerry standalone + # Jerry standalone + # Linux set(SOURCE_JERRY_STANDALONE_MAIN_LINUX src/main_linux.cpp) - file(GLOB SOURCE_JERRY_LIBC_LINUX jerry-libc/target/linux/*.cpp jerry-libc/target/linux/*.S) - # MCU - # Jerry standalone - set(SOURCE_JERRY_STANDALONE_MAIN_MCU src/main_mcu.cpp) - - # stm32f3 - file(GLOB SOURCE_JERRY_LIBC_STM32F3 jerry-libc/target/stm32f3/*.cpp jerry-libc/target/stm32f3/*.S) - # stm32f4 - file(GLOB SOURCE_JERRY_LIBC_STM32F4 jerry-libc/target/stm32f4/*.cpp jerry-libc/target/stm32f4/*.S) - - # Third-party - # Platform-specific # MCU # stm32f3 - set(SOURCE_THIRD_PARTY_MCU_STM32F3 - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Source/Templates/gcc_ride7/startup_stm32f30x.s - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Source/Templates/system_stm32f30x.c - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/src/stm32f30x_tim.c - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/src/stm32f30x_gpio.c - third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/src/stm32f30x_rcc.c) + set(SOURCE_JERRY_STANDALONE_MAIN_MCU_STM32F3 src/main_mcu.cpp) + # stm32f4 - set(SOURCE_THIRD_PARTY_MCU_STM32F4 - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f4xx.s - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_tim.c - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c) + set(SOURCE_JERRY_STANDALONE_MAIN_MCU_STM32F4 src/main_mcu.cpp) # Unit tests main modules file(GLOB SOURCE_UNIT_TEST_MAIN_MODULES tests/unit/*.cpp) @@ -366,205 +198,120 @@ project (Jerry CXX C ASM) # Imported libraries # libc add_library(imported_libc SHARED IMPORTED) - execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.so + execute_process(COMMAND ${CMAKE_C_COMPILER} ${FLAGS_COMMON_ARCH} -print-file-name=libc.so OUTPUT_VARIABLE IMPORTED_LIBC_LOCATION OUTPUT_STRIP_TRAILING_WHITESPACE) set_property(TARGET imported_libc PROPERTY IMPORTED_LOCATION ${IMPORTED_LIBC_LOCATION}) # libgcc add_library(imported_libgcc STATIC IMPORTED) - execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libgcc.a + execute_process(COMMAND ${CMAKE_C_COMPILER} ${FLAGS_COMMON_ARCH} -print-file-name=libgcc.a OUTPUT_VARIABLE IMPORTED_LIBGCC_LOCATION OUTPUT_STRIP_TRAILING_WHITESPACE) set_property(TARGET imported_libgcc PROPERTY IMPORTED_LOCATION ${IMPORTED_LIBGCC_LOCATION}) -# Architecture-specific configuration - if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") - set(CXX_FLAGS_COMMON_ARCH ${CXX_FLAGS_JERRY_X86_64}) - set(LINKER_FLAGS_JERRY "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_JERRY_X86_64}") - set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_X86_64}) - elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l") - set(CXX_FLAGS_COMMON_ARCH ${CXX_FLAGS_JERRY_ARMV7}) - set(LINKER_FLAGS_JERRY "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_JERRY_ARMV7}") - set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_ARMV7}) - else() - message(FATAL_ERROR "Unsupported machine architecture") - endif() - # Platform-specific configuration - if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_LINUX}) - elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Generic") - set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_MCU}) - else() - message(FATAL_ERROR "Platform is not supported") - endif() + set(MODIFIERS_LISTS ${MODIFIERS_LISTS_${PLATFORM_EXT}}) + set(LINKER_FLAGS_COMMON "${LINKER_FLAGS_COMMON} ${LINKER_FLAGS_COMMON_${PLATFORM_EXT}}") + set(SOURCE_JERRY_STANDALONE_MAIN ${SOURCE_JERRY_STANDALONE_MAIN_${PLATFORM_EXT}}) + +# Component targets + # Jerry's Core + add_subdirectory(src) + + # Jerry's libc + add_subdirectory(jerry-libc) + + # Plugins + add_subdirectory(plugins) # Targets declaration - if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - function(declare_targets_for_build_mode BUILD_MODE MODIFIERS_LISTS) - set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.linux) - set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_${BUILD_MODE}}) - set(LINKER_FLAGS_JERRY "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_COMMON_${BUILD_MODE}}") + function(declare_targets_for_build_mode BUILD_MODE) + string(TOLOWER "${PLATFORM_EXT}" PLATFORM_L) + set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.${PLATFORM_L}) + set(LIBC_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.jerry-libc.${PLATFORM_L}) - function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument - foreach(MODIFIER ${ARGN}) - set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - set(DEFINES_JERRY ${DEFINES_JERRY} ${${MODIFIER_DEFINES_${MODIFIER}}}) - set(INCLUDE_CORE ${INCLUDE_CORE} ${${MODIFIER_INCLUDE_${MODIFIER}}}) - endforeach() + function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument + set(CORE_TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}) + foreach(MODIFIER ${ARGN}) # FIXME + set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - add_library(${TARGET_NAME}.lib STATIC ${SOURCE_CORE} ${SOURCE_JERRY_LIBC_LINUX}) - target_compile_options(${TARGET_NAME}.lib PRIVATE ${CXX_FLAGS_JERRY} ${CXX_FLAGS_COMMON_ARCH} ${CXX_FLAGS_COMMON_${BUILD_MODE}}) - target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_JERRY}) - target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_CORE}) - - add_executable(${TARGET_NAME} ${SOURCE_JERRY_STANDALONE_MAIN_LINUX}) - target_compile_options(${TARGET_NAME} PRIVATE ${CXX_FLAGS_JERRY} ${CXX_FLAGS_COMMON_ARCH} ${CXX_FLAGS_COMMON_${BUILD_MODE}}) - set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_STATIC}") - target_compile_definitions(${TARGET_NAME} PRIVATE ${DEFINES_JERRY}) - target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE}) - target_link_libraries(${TARGET_NAME} ${TARGET_NAME}.lib imported_libgcc) - - if(${STRIP_LINUX_RELEASE_BINARY} STREQUAL "ON") - add_custom_command(TARGET ${TARGET_NAME} - POST_BUILD - COMMAND ${CMAKE_STRIP} $) - endif() - endfunction() - - foreach(MODIFIERS_LIST ${MODIFIERS_LISTS}) - separate_arguments(MODIFIERS_LIST) - - declare_target_with_modifiers(${MODIFIERS_LIST}) + set(LIBC_TARGET_NAME ${LIBC_TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) + set(CORE_TARGET_NAME ${CORE_TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) endforeach() + set(CORE_TARGET_NAME ${CORE_TARGET_NAME}.jerry-core) + set(LIBC_TARGET_NAME ${LIBC_TARGET_NAME}.lib) + + set(DEFINES_JERRY ) + + if("${PLATFORM}" STREQUAL "MCU") + set(MCU_SCRIPT_GENERATED_HEADER ${MCU_SCRIPT_GENERATED_HEADER}.${TARGET_NAME}) + add_custom_command(OUTPUT ${MCU_SCRIPT_GENERATED_HEADER} + COMMAND ${CMAKE_SOURCE_DIR}/tools/generator.sh "${CMAKE_SOURCE_DIR}/${MCU_SCRIPT_FILE}" ${MCU_SCRIPT_GENERATED_HEADER} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_custom_target(mcu_header_with_script_to_run.${TARGET_NAME} DEPENDS ${MCU_SCRIPT_GENERATED_HEADER}) + set(DEFINES_JERRY ${DEFINES_JERRY} JERRY_MCU_SCRIPT_HEADER="${MCU_SCRIPT_GENERATED_HEADER}") + endif() + + add_executable(${TARGET_NAME} ${SOURCE_JERRY_STANDALONE_MAIN}) + set_property(TARGET ${TARGET_NAME} + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_${BUILD_MODE}}") + set_property(TARGET ${TARGET_NAME} + PROPERTY LINK_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_${BUILD_MODE}} ${LINKER_FLAGS_COMMON} ${LINKER_FLAGS_STATIC}") + target_compile_definitions(${TARGET_NAME} PRIVATE ${DEFINES_JERRY}) + target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE}) + target_link_libraries(${TARGET_NAME} ${CORE_TARGET_NAME} ${LIBC_TARGET_NAME} imported_libgcc) + + if("${PLATFORM}" STREQUAL "MCU") + add_dependencies(${TARGET_NAME} mcu_header_with_script_to_run.${TARGET_NAME}) + add_custom_target(${TARGET_NAME}.bin + COMMAND ${CMAKE_OBJCOPY} -Obinary $ $.bin + DEPENDS ${TARGET_NAME}) + add_custom_target(${TARGET_NAME}.flash + COMMAND st-flash write $.bin 0x08000000 + DEPENDS ${TARGET_NAME}.bin) + endif() + + if(${STRIP_RELEASE_BINARY} STREQUAL "ON") + add_custom_command(TARGET ${TARGET_NAME} + POST_BUILD + COMMAND ${CMAKE_STRIP} $) + endif() endfunction() - set(DEBUG_AND_RELEASE_MODIFIERS_LISTS - "FULL_PROFILE" - "COMPACT_PROFILE" - "COMPACT_PROFILE_MINIMAL" - "FULL_PROFILE MEMORY_STATISTICS" - "COMPACT_PROFILE_MINIMAL MEMORY_STATISTICS" - "FULL_PROFILE VALGRIND" - "COMPACT_PROFILE_MINIMAL VALGRIND" - "COMPACT_PROFILE VALGRIND") - declare_targets_for_build_mode(DEBUG "${DEBUG_AND_RELEASE_MODIFIERS_LISTS}") - declare_targets_for_build_mode(RELEASE "${DEBUG_AND_RELEASE_MODIFIERS_LISTS}") + foreach(MODIFIERS_LIST ${MODIFIERS_LISTS}) + separate_arguments(MODIFIERS_LIST) - # Unit tests declaration - add_custom_target(unittests) + declare_target_with_modifiers(${MODIFIERS_LIST}) + endforeach() + endfunction() - add_library(unit_tests.lib STATIC ${SOURCE_CORE} ${SOURCE_JERRY_LIBC_LINUX}) - target_compile_options(unit_tests.lib PRIVATE ${CXX_FLAGS_JERRY} ${CXX_FLAGS_COMMON_ARCH} ${CXX_FLAGS_UNIT_TEST}) - target_compile_definitions(unit_tests.lib PRIVATE ${DEFINES_JERRY} ${DEFINES_UNIT_TEST}) - target_include_directories(unit_tests.lib PRIVATE ${INCLUDE_CORE} ${INCLUDE_UNIT_TEST}) + foreach(BUILD_MODE ${BUILD_MODES}) + declare_targets_for_build_mode(${BUILD_MODE}) + endforeach() - foreach(SOURCE_UNIT_TEST_MAIN ${SOURCE_UNIT_TEST_MAIN_MODULES}) - get_filename_component(TARGET_NAME ${SOURCE_UNIT_TEST_MAIN} NAME_WE) - set(TARGET_NAME unit_${TARGET_NAME}) - - add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_MAIN}) - target_compile_options(${TARGET_NAME} PRIVATE - ${CXX_FLAGS_JERRY} - ${CXX_FLAGS_COMMON_ARCH} - ${CXX_FLAGS_UNIT_TEST}) - set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_UNIT_TEST}") - target_compile_definitions(${TARGET_NAME} PRIVATE ${DEFINES_JERRY} ${DEFINES_UNIT_TEST}) - target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE} ${INCLUDE_UNIT_TEST}) - target_link_libraries(${TARGET_NAME} unit_tests.lib imported_libc imported_libgcc) - - add_dependencies(unittests ${TARGET_NAME}) - endforeach() - elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Generic") - function(declare_target_for_platform PLATFORM) # build modes are passed in ARGN - string(TOLOWER ${PLATFORM} PLATFORM_L) - set(TARGET_NAME ${PLATFORM_L}) - set(BUILD_MODES_FOR_PLATFORM ${ARGN}) - - function(declare_targets_for_build_mode BUILD_MODE) - set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.${TARGET_NAME}) - set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_${BUILD_MODE}}) - set(LINKER_FLAGS_JERRY "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_COMMON_${BUILD_MODE}}") - - function(declare_target_with_modifiers ) # modifiers are passed in ARGN - foreach(MODIFIER ${ARGN}) - set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) - set(DEFINES_JERRY ${DEFINES_JERRY} ${${MODIFIER_DEFINES_${MODIFIER}}}) - set(INCLUDE_CORE ${INCLUDE_CORE} ${${MODIFIER_INCLUDE_${MODIFIER}}}) - endforeach() - - set(MCU_SCRIPT_GENERATED_HEADER ${MCU_SCRIPT_GENERATED_HEADER}.${TARGET_NAME}) - add_custom_command(OUTPUT ${MCU_SCRIPT_GENERATED_HEADER} - COMMAND ${CMAKE_SOURCE_DIR}/tools/generator.sh "${CMAKE_SOURCE_DIR}/${MCU_SCRIPT_FILE}" ${MCU_SCRIPT_GENERATED_HEADER} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) - add_custom_target(mcu_header_with_script_to_run.${TARGET_NAME} DEPENDS ${MCU_SCRIPT_GENERATED_HEADER}) - set(DEFINES_JERRY_MCU_SCRIPT JERRY_MCU_SCRIPT_HEADER="${MCU_SCRIPT_GENERATED_HEADER}") - - # Jerry library - add_library(${TARGET_NAME}.jerry.lib STATIC ${SOURCE_CORE} ${SOURCE_JERRY_LIBC_${PLATFORM}}) - target_compile_options(${TARGET_NAME}.jerry.lib PRIVATE - ${CXX_FLAGS_JERRY} - ${CXX_FLAGS_COMMON_${BUILD_MODE}} - ${CXX_FLAGS_COMMON_ARCH} - ${CXX_FLAGS_COMMON_MCU_${PLATFORM}}) - target_compile_definitions(${TARGET_NAME}.jerry.lib PRIVATE - ${DEFINES_JERRY} - ${DEFINES_JERRY_MCU_${PLATFORM}}) - target_include_directories(${TARGET_NAME}.jerry.lib PRIVATE - ${INCLUDE_CORE} - ${INCLUDE_CORE_MCU_${PLATFORM}} - ${INCLUDE_THIRD_PARTY_MCU_${PLATFORM}}) - - # Third-party MCU library - add_library(${TARGET_NAME}.third_party.lib STATIC - ${SOURCE_THIRD_PARTY_MCU_${PLATFORM}}) - target_compile_options(${TARGET_NAME}.third_party.lib PRIVATE - ${CXX_FLAGS_COMMON_${BUILD_MODE}} - ${CXX_FLAGS_COMMON_ARCH} - ${CXX_FLAGS_COMMON_MCU_${PLATFORM}}) - target_include_directories(${TARGET_NAME}.third_party.lib PRIVATE - ${INCLUDE_THIRD_PARTY_MCU_${PLATFORM}}) - - add_executable(${TARGET_NAME} ${SOURCE_JERRY_STANDALONE_MAIN_MCU}) - target_compile_options(${TARGET_NAME} PRIVATE - ${CXX_FLAGS_JERRY} - ${CXX_FLAGS_COMMON_${BUILD_MODE}} - ${CXX_FLAGS_COMMON_ARCH} - ${CXX_FLAGS_COMMON_MCU_${PLATFORM}}) - set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS - "${LINKER_FLAGS_JERRY} ${LINKER_FLAGS_STATIC} ${LINKER_FLAGS_JERRY_MCU_${PLATFORM}}") - target_compile_definitions(${TARGET_NAME} PRIVATE - ${DEFINES_JERRY} - ${DEFINES_JERRY_MCU_${PLATFORM}} - ${DEFINES_JERRY_MCU_SCRIPT}) - target_include_directories(${TARGET_NAME} PRIVATE - ${INCLUDE_CORE} - ${INCLUDE_CORE_MCU_${PLATFORM}} - ${INCLUDE_THIRD_PARTY_MCU_${PLATFORM}}) - target_link_libraries(${TARGET_NAME} ${TARGET_NAME}.jerry.lib ${TARGET_NAME}.third_party.lib imported_libgcc) - add_dependencies(${TARGET_NAME} mcu_header_with_script_to_run.${TARGET_NAME}) - - add_custom_target(${TARGET_NAME}.bin - COMMAND ${CMAKE_OBJCOPY} -Obinary $ $.bin - DEPENDS ${TARGET_NAME}) - add_custom_target(${TARGET_NAME}.flash - COMMAND st-flash write $.bin 0x08000000 - DEPENDS ${TARGET_NAME}.bin) - endfunction() - - declare_target_with_modifiers(COMPACT_PROFILE) - declare_target_with_modifiers(COMPACT_PROFILE_MINIMAL) - endfunction() - - foreach(BUILD_MODE ${BUILD_MODES_FOR_PLATFORM}) - declare_targets_for_build_mode(${BUILD_MODE}) - endforeach() - endfunction() - - declare_target_for_platform(STM32F3 RELEASE) - declare_target_for_platform(STM32F4 DEBUG RELEASE) - else() - message(FATAL_ERROR "Platform is not supported") - endif() + # Unit tests declaration +# --- add_custom_target(unittests) +# --- +# --- add_library(unit_tests.lib STATIC ${SOURCE_CORE} ${SOURCE_JERRY_LIBC_LINUX}) +# --- target_compile_options(unit_tests.lib PRIVATE ${CXX_FLAGS_JERRY} ${CXX_FLAGS_COMMON_ARCH} ${CXX_FLAGS_UNIT_TEST}) +# --- target_compile_definitions(unit_tests.lib PRIVATE ${DEFINES_JERRY} ${DEFINES_UNIT_TEST}) +# --- target_include_directories(unit_tests.lib PRIVATE ${INCLUDE_CORE} ${INCLUDE_UNIT_TEST}) +# --- +# --- foreach(SOURCE_UNIT_TEST_MAIN ${SOURCE_UNIT_TEST_MAIN_MODULES}) +# --- get_filename_component(TARGET_NAME ${SOURCE_UNIT_TEST_MAIN} NAME_WE) +# --- set(TARGET_NAME unit_${TARGET_NAME}) +# --- +# --- add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_MAIN}) +# --- target_compile_options(${TARGET_NAME} PRIVATE +# --- ${CXX_FLAGS_JERRY} +# --- ${CXX_FLAGS_COMMON_ARCH} +# --- ${CXX_FLAGS_UNIT_TEST}) +# --- set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON} ${LINKER_FLAGS_UNIT_TEST}") +# --- target_compile_definitions(${TARGET_NAME} PRIVATE ${DEFINES_JERRY} ${DEFINES_UNIT_TEST}) +# --- target_include_directories(${TARGET_NAME} PRIVATE ${INCLUDE_CORE} ${INCLUDE_UNIT_TEST}) +# --- target_link_libraries(${TARGET_NAME} unit_tests.lib imported_libc imported_libgcc) +# --- +# --- add_dependencies(unittests ${TARGET_NAME}) +# --- endforeach() diff --git a/Makefile b/Makefile index 5490f6c16..220aea092 100644 --- a/Makefile +++ b/Makefile @@ -39,24 +39,29 @@ export TARGET_DEBUG_MODES = debug export TARGET_RELEASE_MODES = release export TARGET_PC_SYSTEMS = linux -export TARGET_MCU_SYSTEMS = $(addprefix stm32f,3 4) -export TARGET_PC_MODS = valgrind cp cp_minimal mem_stats cp-valgrind +export TARGET_PC_MODS = cp cp_minimal mem_stats export TARGET_MCU_MODS = cp cp_minimal export TARGET_PC_SYSTEMS_MODS = $(TARGET_PC_SYSTEMS) \ $(foreach __MOD,$(TARGET_PC_MODS),$(foreach __SYSTEM,$(TARGET_PC_SYSTEMS),$(__SYSTEM)-$(__MOD))) -export TARGET_MCU_SYSTEMS_MODS = $(foreach __MOD,$(TARGET_MCU_MODS),$(foreach __SYSTEM,$(TARGET_MCU_SYSTEMS),$(__SYSTEM)-$(__MOD))) +export TARGET_STM32F3_MODS = $(foreach __MOD,$(TARGET_MCU_MODS),mcu_stm32f3-$(__MOD)) +export TARGET_STM32F4_MODS = $(foreach __MOD,$(TARGET_MCU_MODS),mcu_stm32f4-$(__MOD)) # Target list export JERRY_LINUX_TARGETS = $(foreach __MODE,$(TARGET_DEBUG_MODES),$(foreach __SYSTEM,$(TARGET_PC_SYSTEMS_MODS),$(__MODE).$(__SYSTEM))) \ $(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreach __SYSTEM,$(TARGET_PC_SYSTEMS_MODS),$(__MODE).$(__SYSTEM))) -export JERRY_MCU_TARGETS = $(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreach __SYSTEM,$(TARGET_MCU_SYSTEMS_MODS),$(__MODE).$(__SYSTEM))) -export JERRY_TARGETS = $(JERRY_LINUX_TARGETS) $(JERRY_MCU_TARGETS) -export CHECK_TARGETS = $(foreach __TARGET,$(JERRY_TARGETS),$(__TARGET).check) -export FLASH_TARGETS = $(foreach __TARGET,$(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreach __SYSTEM,$(TARGET_MCU_SYSTEMS_MODS),$(__MODE).$(__SYSTEM))),$(__TARGET).flash) +export JERRY_STM32F3_TARGETS = $(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreach __SYSTEM,$(TARGET_STM32F3_MODS),$(__MODE).$(__SYSTEM))) + +export JERRY_STM32F4_TARGETS = $(foreach __MODE,$(TARGET_DEBUG_MODES),$(foreach __SYSTEM,$(TARGET_STM32F4_MODS),$(__MODE).$(__SYSTEM))) \ + $(foreach __MODE,$(TARGET_RELEASE_MODES),$(foreach __SYSTEM,$(TARGET_STM32F4_MODS),$(__MODE).$(__SYSTEM))) + +export JERRY_TARGETS = $(JERRY_LINUX_TARGETS) $(JERRY_STM32F3_TARGETS) $(JERRY_STM32F4_TARGETS) + +export CHECK_TARGETS = $(foreach __TARGET,$(JERRY_LINUX_TARGETS),$(__TARGET).check) +export FLASH_TARGETS = $(foreach __TARGET,$(JERRY_STM32F3_TARGETS) $(JERRY_STM32F4_TARGETS),$(__TARGET).flash) export OUT_DIR = ./build/bin export BUILD_DIR = ./build/obj @@ -66,12 +71,14 @@ export SHELL=/bin/bash all: precommit $(BUILD_DIR)/native: - @ mkdir -p $(BUILD_DIR)/native - @ cd $(BUILD_DIR)/native; cmake ../../.. &>cmake.log + @ arch=`uname -p`; if [ "$$arch" == "armv7l" ]; then readelf -A /proc/self/exe | grep Tag_ABI_VFP_args && arch=$$arch"-hf" || arch=$$arch"-el"; fi; \ + mkdir -p $(BUILD_DIR)/native && cd $(BUILD_DIR)/native && cmake -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_linux_$$arch.cmake ../../.. &>cmake.log -$(BUILD_DIR)/mcu: - @ mkdir -p $(BUILD_DIR)/mcu - @ cd $(BUILD_DIR)/mcu; cmake -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_mcu_armv7l.cmake ../../.. &>cmake.log +$(BUILD_DIR)/stm32f3: + @ mkdir -p $(BUILD_DIR)/stm32f3 && cd $(BUILD_DIR)/stm32f3 && cmake -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_mcu_stm32f3.cmake ../../.. &>cmake.log + +$(BUILD_DIR)/stm32f4: + @ mkdir -p $(BUILD_DIR)/stm32f4 && cd $(BUILD_DIR)/stm32f4 && cmake -DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_mcu_stm32f4.cmake ../../.. &>cmake.log $(JERRY_LINUX_TARGETS): $(BUILD_DIR)/native @ mkdir -p $(OUT_DIR)/$@ @@ -83,20 +90,27 @@ unittests: $(BUILD_DIR)/native @ $(MAKE) -C $(BUILD_DIR)/native VERBOSE=1 $@ &>$(OUT_DIR)/$@/make.log @ cp $(BUILD_DIR)/native/unit_test_* $(OUT_DIR)/$@ -$(JERRY_MCU_TARGETS): $(BUILD_DIR)/mcu +$(JERRY_STM32F3_TARGETS): $(BUILD_DIR)/stm32f3 @ mkdir -p $(OUT_DIR)/$@ - @ $(MAKE) -C $(BUILD_DIR)/mcu VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log - @ cp $(BUILD_DIR)/mcu/$@ $(OUT_DIR)/$@/jerry - @ cp $(BUILD_DIR)/mcu/$@.bin $(OUT_DIR)/$@/jerry.bin + @ $(MAKE) -C $(BUILD_DIR)/stm32f3 VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log + @ cp $(BUILD_DIR)/stm32f3/$@ $(OUT_DIR)/$@/jerry + @ cp $(BUILD_DIR)/stm32f3/$@.bin $(OUT_DIR)/$@/jerry.bin -build: $(JERRY_TARGETS) unittests +$(JERRY_STM32F4_TARGETS): $(BUILD_DIR)/stm32f4 + @ mkdir -p $(OUT_DIR)/$@ + @ $(MAKE) -C $(BUILD_DIR)/stm32f4 VERBOSE=1 $@.bin &>$(OUT_DIR)/$@/make.log + @ cp $(BUILD_DIR)/stm32f4/$@ $(OUT_DIR)/$@/jerry + @ cp $(BUILD_DIR)/stm32f4/$@.bin $(OUT_DIR)/$@/jerry.bin + +build: $(JERRY_TARGETS) # unittests $(FLASH_TARGETS): $(BUILD_DIR)/mcu @$(MAKE) -C $(BUILD_DIR)/mcu VERBOSE=1 $@ 1>/dev/null PRECOMMIT_CHECK_TARGETS_NO_VALGRIND_LIST= debug.linux.check \ release.linux.check -PRECOMMIT_CHECK_TARGETS_VALGRIND_LIST= debug.linux-valgrind.check \ + +PRECOMMIT_CHECK_TARGETS_VALGRIND_LIST= #debug.linux-valgrind.check \ release.linux-valgrind.check \ release.linux-cp-valgrind.check @@ -113,9 +127,10 @@ precommit: clean @ echo -e "\nBuilding...\n\n" @ $(MAKE) build @ echo -e "\n================ Build completed successfully. Running precommit tests ================\n" - @ echo -e "All targets were built successfully. Starting unit tests' run.\n" - @ $(MAKE) unittests_run TESTS_OPTS="--silent" - @ echo -e "Unit tests completed successfully. Starting parse-only testing.\n" + @ #echo -e "All targets were built successfully. Starting unit tests' run.\n" + @ #$(MAKE) unittests_run TESTS_OPTS="--silent" + @ #echo -e "Unit tests completed successfully. Starting parse-only testing.\n" + @ #echo -e "All targets were built successfully. Starting parse-only testing.\n" @ # Parse-only testing @ for path in "./tests/jerry" "./tests/benchmarks/jerry"; \ do \ @@ -166,8 +181,8 @@ precommit: clean done @ echo -e "Full testing completed successfully\n\n================\n\n" -unittests_run: unittests - @$(MAKE) -s -f Makefile.mk TARGET=$@ $@ +#unittests_run: unittests +# @$(MAKE) -s -f Makefile.mk TARGET=$@ $@ clean: @ rm -rf $(BUILD_DIR) $(OUT_DIR) diff --git a/build/configs/toolchain_linux_armv7l-hf.cmake b/build/configs/toolchain_linux_armv7l-hf.cmake index 7275b99e7..9f7405d93 100644 --- a/build/configs/toolchain_linux_armv7l-hf.cmake +++ b/build/configs/toolchain_linux_armv7l-hf.cmake @@ -17,3 +17,5 @@ set(CMAKE_SYSTEM_PROCESSOR armv7l) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) + +set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb) diff --git a/build/configs/toolchain_linux_x86_64.cmake b/build/configs/toolchain_linux_x86_64.cmake index 405e8dff0..8b966fe66 100644 --- a/build/configs/toolchain_linux_x86_64.cmake +++ b/build/configs/toolchain_linux_x86_64.cmake @@ -17,3 +17,5 @@ set(CMAKE_SYSTEM_PROCESSOR x86_64) set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++) + +set(FLAGS_COMMON_ARCH -ffixed-rbp) diff --git a/build/configs/toolchain_mcu_armv7l.cmake b/build/configs/toolchain_mcu_stm32f3.cmake similarity index 81% rename from build/configs/toolchain_mcu_armv7l.cmake rename to build/configs/toolchain_mcu_stm32f3.cmake index b58ed1321..efa3980a7 100644 --- a/build/configs/toolchain_mcu_armv7l.cmake +++ b/build/configs/toolchain_mcu_stm32f3.cmake @@ -14,8 +14,11 @@ include(CMakeForceCompiler) -set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_NAME MCU) set(CMAKE_SYSTEM_PROCESSOR armv7l) +set(CMAKE_SYSTEM_VERSION STM32F3) + +set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard) CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU) CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU) diff --git a/build/configs/toolchain_mcu_stm32f4.cmake b/build/configs/toolchain_mcu_stm32f4.cmake new file mode 100644 index 000000000..967d3778c --- /dev/null +++ b/build/configs/toolchain_mcu_stm32f4.cmake @@ -0,0 +1,24 @@ +# Copyright 2015 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include(CMakeForceCompiler) + +set(CMAKE_SYSTEM_NAME MCU) +set(CMAKE_SYSTEM_PROCESSOR armv7l) +set(CMAKE_SYSTEM_VERSION STM32F4) + +set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard) + +CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU) +CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU) diff --git a/jerry-libc/CMakeLists.txt b/jerry-libc/CMakeLists.txt new file mode 100644 index 000000000..b921343f7 --- /dev/null +++ b/jerry-libc/CMakeLists.txt @@ -0,0 +1,151 @@ +# Copyright 2015 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required (VERSION 2.8.12) +project (Jerry_LibC C ASM) + +# Compiler / linker flags +set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}") + +# Definitions + set(DEFINES_LIBC ) + + # Debug + set(DEFINES_LIBC_DEBUG ) + + # Release + set(DEFINES_LIBC_RELEASE LIBC_NDEBUG) + +# Architecture-specific + # x86_64 + set(DEFINES_LIBC_X86_64 __TARGET_HOST_x64) + # ARMv7 + set(DEFINES_LIBC_ARMV7 __TARGET_HOST_ARMv7) + + # Platform-specific + # Linux + set(DEFINES_LIBC_LINUX __TARGET_HOST) + # MCU + set(DEFINES_LIBC_MCU __TARGET_MCU) + # stm32f3 + set(DEFINES_LIBC_MCU_STM32F3 __TARGET_MCU_STM32F3) + # stm32f4 + set(DEFINES_LIBC_MCU_STM32F4 __TARGET_MCU_STM32F4) + +# Include directories + set(INCLUDE_LIBC .) + + # Platform-specific + # Linux + set(INCLUDE_LIBC_LINUX target/linux) + # MCU + # STM32F3 + set(INCLUDE_LIBC_MCU_STM32F3 target/stm32f3) + # STM32F4 + set(INCLUDE_LIBC_MCU_STM32F4 target/stm32f4) + + # Third-party + # Platform-specific + # Linux + set(INCLUDE_THIRD_PARTY_LINUX ) + + # MCU + # STM32F3 + set(INCLUDE_THIRD_PARTY_MCU_STM32F3 + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Include + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Include) + # STM32F4 + set(INCLUDE_THIRD_PARTY_MCU_STM32F4 + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include) + +# Sources + file(GLOB SOURCE_LIBC *.c) + + # Platform-specific + # Linux + file(GLOB SOURCE_LIBC_LINUX target/linux/*.c target/linux/*.S) + + # MCU + # stm32f3 + file(GLOB SOURCE_LIBC_MCU_STM32F3 target/mcu-stubs/*.c target/mcu-stubs/*.S) + # stm32f4 + file(GLOB SOURCE_LIBC_MCU_STM32F4 target/mcu-stubs/*.c target/mcu-stubs/*.S) + + # Third-party + # Platform-specific + # MCU + # stm32f3 + set(SOURCE_THIRD_PARTY_MCU_STM32F3 + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Source/Templates/system_stm32f30x.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Source/Templates/gcc_ride7/startup_stm32f30x.s) + # stm32f4 + set(SOURCE_THIRD_PARTY_MCU_STM32F4 + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f4xx.s) + +# Architecture-specific configuration + if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") + set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_X86_64}) + elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l") + set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_ARMV7}) + else() + message(FATAL_ERROR "Unsupported machine architecture") + endif() + +# Platform-specific configuration + set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_${PLATFORM}}) + +# Targets declaration + string(TOLOWER ${PLATFORM_EXT} PLATFORM_L) + set(TARGET_NAME jerry-libc.${PLATFORM_L}) + + function(declare_targets_for_build_mode BUILD_MODE) + set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.${TARGET_NAME}) + set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_${BUILD_MODE}}) + set(INCLUDE_LIBC ${INCLUDE_LIBC} ${INCLUDE_LIBC_${PLATFORM_EXT}}) + + function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument + foreach(MODIFIER ${ARGN}) + set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) + endforeach() + + # Jerry + add_library(${TARGET_NAME}.lib STATIC ${SOURCE_LIBC} ${SOURCE_LIBC_${PLATFORM_EXT}}) + set_property(TARGET ${TARGET_NAME}.lib + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_LIBC} ${FLAGS_COMMON_${BUILD_MODE}}") + target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_LIBC}) + target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_LIBC}) + + # Third-party MCU library + if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) + add_library(${TARGET_NAME}.third_party.lib STATIC ${SOURCE_THIRD_PARTY_${PLATFORM_EXT}}) + set_property(TARGET ${TARGET_NAME}.third_party.lib + PROPERTY COMPILE_FLAGS "${FLAGS_COMMON_${BUILD_MODE}}") + target_include_directories(${TARGET_NAME}.third_party.lib PRIVATE ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) + + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}.third_party.lib) + endif() + endfunction() + + foreach(MODIFIERS_LIST ${MODIFIERS_LISTS}) + separate_arguments(MODIFIERS_LIST) + + declare_target_with_modifiers(${MODIFIERS_LIST}) + endforeach() + endfunction() + + foreach(BUILD_MODE ${BUILD_MODES}) + declare_targets_for_build_mode(${BUILD_MODE}) + endforeach() diff --git a/jerry-libc/jerry-libc-defs.h b/jerry-libc/jerry-libc-defs.h new file mode 100644 index 000000000..a03eeed27 --- /dev/null +++ b/jerry-libc/jerry-libc-defs.h @@ -0,0 +1,117 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DEFS_H +#define DEFS_H + +#include +#include +#include +#include + +/** + * Attributes + */ +#define __attr_unused___ __attribute__((unused)) +#define __attr_used___ __attribute__((used)) +#define __attr_noreturn___ __attribute__((noreturn)) +#define __attr_noinline___ __attribute__((noinline)) + +/** + * Constants + */ +#define LIBC_FATAL_ERROR_EXIT_CODE (2) + +/** + * Assertions + */ +extern void __attr_noreturn___ +libc_fatal (const char *msg, + const char *file_name, + const char *function_name, + const int line_number); + +#ifndef LIBC_NDEBUG +# define LIBC_ASSERT(x) do { if (__builtin_expect (!(x), 0)) { \ + libc_fatal (#x, __FILE__, __FUNCTION__, __LINE__); } } while (0) +# define LIBC_UNREACHABLE() \ + do \ + { \ + libc_fatal ("Code is unreachable", __FILE__, __FUNCTION__, __LINE__); \ + } while (0) +#else /* !LIBC_NDEBUG */ +# define LIBC_ASSERT(x) do { if (false) { (void)(x); } } while (0) +# define LIBC_UNREACHABLE() \ + do \ + { \ + libc_fatal (NULL, NULL, NULL, 0); \ + } while (0) +#endif /* !LIBC_NDEBUG */ + +/** + * Stubs declaration + */ + +/** + * Unreachable stubs for routines that are never called, + * but referenced from third-party libraries. + */ +#define LIBC_UNREACHABLE_STUB_FOR(...) \ +__attr_used___ __VA_ARGS__ \ +{ \ + LIBC_UNREACHABLE (); \ +} + +/** + * Libc redefinitions + */ + +/* Ensuring no macro implementation of variables / functions are in effect */ +#undef vfprintf +#undef fprintf +#undef printf +#undef isspace +#undef isalpha +#undef islower +#undef isupper +#undef isdigit +#undef isxdigit +#undef memset +#undef memcmp +#undef memcpy +#undef memmove +#undef strcmp +#undef strncmp +#undef strncpy +#undef strlen +#undef putchar +#undef puts +#undef exit +#undef fopen +#undef rewind +#undef fclose +#undef fseek +#undef ftell +#undef fread +#undef fwrite +#undef stdin +#undef stdout +#undef stderr + +extern FILE* stdin; +extern FILE* stdout; +extern FILE* stderr; + +#endif /* !DEFS_H */ diff --git a/jerry-libc/jerry-libc-fatals.c b/jerry-libc/jerry-libc-fatals.c new file mode 100644 index 000000000..17ce3abf8 --- /dev/null +++ b/jerry-libc/jerry-libc-fatals.c @@ -0,0 +1,44 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Jerry libc's fatal errors handlers + */ + +#include + +#include "jerry-libc-defs.h" + +/** + * Fatal error handler + * + * Arguments may be NULL. If so, they are ignored. + */ +void __attr_noreturn___ +libc_fatal (const char *msg, /**< fatal error description */ + const char *file_name, /**< file name */ + const char *function_name, /**< function name */ + const int line_number) /**< line number */ +{ + if (msg != NULL + && file_name != NULL + && function_name != NULL) + { + printf("Assertion '%s' failed at %s (%s:%u).\n", + msg, function_name, file_name, line_number); + } + + exit (LIBC_FATAL_ERROR_EXIT_CODE); +} /* libc_fatal */ diff --git a/jerry-libc/jerry-libc-printf.cpp b/jerry-libc/jerry-libc-printf.c similarity index 92% rename from jerry-libc/jerry-libc-printf.cpp rename to jerry-libc/jerry-libc-printf.c index 7a0814c32..8cce98488 100644 --- a/jerry-libc/jerry-libc-printf.cpp +++ b/jerry-libc/jerry-libc-printf.c @@ -17,10 +17,11 @@ * Jerry printf implementation */ -#include "jrt.h" -#include "jerry-libc.h" - #include +#include +#include + +#include "jerry-libc-defs.h" /** * printf's length type @@ -72,7 +73,7 @@ typedef uint8_t libc_printf_arg_flags_mask_t; * printf helper function that outputs a char */ static void -libc_printf_putchar (_FILE *stream, /**< stream pointer */ +libc_printf_putchar (FILE *stream, /**< stream pointer */ char character) /**< character */ { fwrite (&character, 1, sizeof (character), stream); @@ -82,7 +83,7 @@ libc_printf_putchar (_FILE *stream, /**< stream pointer */ * printf helper function that outputs justified string */ static void -libc_printf_justified_string_output (_FILE *stream, /**< stream pointer */ +libc_printf_justified_string_output (FILE *stream, /**< stream pointer */ const char *string_p, /**< string */ size_t width, /**< minimum field width */ bool is_left_justify, /**< justify to left (true) or right (false) */ @@ -130,20 +131,20 @@ libc_printf_uint_to_string (uintmax_t value, /**< integer value */ char *str_p = str_buffer_end; *--str_p = '\0'; - JERRY_ASSERT(radix >= 2); + LIBC_ASSERT(radix >= 2); if ((radix & (radix - 1)) != 0) { /* * Radix is not power of 2. Only 32-bit numbers are supported in this mode. */ - JERRY_ASSERT((value >> 32) == 0); + LIBC_ASSERT((value >> 32) == 0); uint32_t value_lo = (uint32_t) value; while (value_lo != 0) { - JERRY_ASSERT (str_p != buffer_p); + LIBC_ASSERT (str_p != buffer_p); *--str_p = alphabet[ value_lo % radix ]; value_lo /= radix; @@ -156,7 +157,7 @@ libc_printf_uint_to_string (uintmax_t value, /**< integer value */ { shift++; - JERRY_ASSERT(shift <= 32); + LIBC_ASSERT(shift <= 32); } uint32_t value_lo = (uint32_t) value; @@ -165,7 +166,7 @@ libc_printf_uint_to_string (uintmax_t value, /**< integer value */ while (value_lo != 0 || value_hi != 0) { - JERRY_ASSERT (str_p != buffer_p); + LIBC_ASSERT (str_p != buffer_p); *--str_p = alphabet[ value_lo & (radix - 1) ]; value_lo >>= shift; @@ -179,7 +180,7 @@ libc_printf_uint_to_string (uintmax_t value, /**< integer value */ *--str_p = '0'; } - JERRY_ASSERT(str_p >= buffer_p && str_p < str_buffer_end); + LIBC_ASSERT(str_p >= buffer_p && str_p < str_buffer_end); return str_p; } /* libc_printf_uint_to_string */ @@ -190,20 +191,21 @@ libc_printf_uint_to_string (uintmax_t value, /**< integer value */ * @return updated va_list */ static void -libc_printf_write_d_i (_FILE *stream, /**< stream pointer */ +libc_printf_write_d_i (FILE *stream, /**< stream pointer */ va_list* args_list_p, /**< args' list */ libc_printf_arg_flags_mask_t flags, /**< field's flags */ libc_printf_arg_length_type_t length, /**< field's length type */ uint32_t width) /**< minimum field width to output */ { - JERRY_ASSERT((flags & LIBC_PRINTF_ARG_FLAG_SHARP) == 0); + LIBC_ASSERT((flags & LIBC_PRINTF_ARG_FLAG_SHARP) == 0); bool is_signed = true; uintmax_t value = 0; /* true - positive, false - negative */ bool sign = true; - const uintmax_t value_sign_mask = ((uintmax_t)1) << (sizeof (value) * JERRY_BITSINBYTE - 1); + const size_t bits_in_byte = 8; + const uintmax_t value_sign_mask = ((uintmax_t)1) << (sizeof (value) * bits_in_byte - 1); switch (length) { @@ -259,7 +261,7 @@ libc_printf_write_d_i (_FILE *stream, /**< stream pointer */ case LIBC_PRINTF_ARG_LENGTH_TYPE_HIGHL: { - JERRY_UNREACHABLE(); + LIBC_UNREACHABLE(); } } @@ -283,7 +285,7 @@ libc_printf_write_d_i (_FILE *stream, /**< stream pointer */ if (!sign || (flags & LIBC_PRINTF_ARG_FLAG_PRINT_SIGN)) { - JERRY_ASSERT (string_p > str_buffer); + LIBC_ASSERT (string_p > str_buffer); *--string_p = (sign ? '+' : '-'); } else if (flags & LIBC_PRINTF_ARG_FLAG_SPACE) @@ -310,7 +312,7 @@ libc_printf_write_d_i (_FILE *stream, /**< stream pointer */ * @return updated va_list */ static void -libc_printf_write_u_o_x_X(_FILE *stream, /**< stream pointer */ +libc_printf_write_u_o_x_X(FILE *stream, /**< stream pointer */ char specifier, /**< specifier (u, o, x, X) */ va_list* args_list_p, /**< args' list */ libc_printf_arg_flags_mask_t flags, /**< field's flags */ @@ -371,7 +373,7 @@ libc_printf_write_u_o_x_X(_FILE *stream, /**< stream pointer */ case LIBC_PRINTF_ARG_LENGTH_TYPE_HIGHL: { - JERRY_UNREACHABLE(); + LIBC_UNREACHABLE(); } } @@ -391,7 +393,7 @@ libc_printf_write_u_o_x_X(_FILE *stream, /**< stream pointer */ } else { - JERRY_ASSERT(specifier == 'o'); + LIBC_ASSERT(specifier == 'o'); } } } @@ -431,7 +433,7 @@ libc_printf_write_u_o_x_X(_FILE *stream, /**< stream pointer */ default: { - JERRY_UNREACHABLE(); + LIBC_UNREACHABLE(); } } @@ -475,10 +477,10 @@ libc_printf_write_u_o_x_X(_FILE *stream, /**< stream pointer */ * * @return number of characters printed */ -static int -vfprintf (_FILE *stream, /**< stream pointer */ - const char *format, /**< format string */ - va_list args) /**< arguments */ +int +vfprintf (FILE *stream, /**< stream pointer */ + const char *format, /**< format string */ + va_list args) /**< arguments */ { va_list args_copy; @@ -531,7 +533,7 @@ vfprintf (_FILE *stream, /**< stream pointer */ if (*format_iter_p == '*') { /* Not supported */ - JERRY_UNREACHABLE (); + LIBC_UNREACHABLE (); } // If there is a number, recognize it as field width @@ -545,7 +547,7 @@ vfprintf (_FILE *stream, /**< stream pointer */ if (*format_iter_p == '.') { /* Not supported */ - JERRY_UNREACHABLE (); + LIBC_UNREACHABLE (); } switch (*format_iter_p) @@ -639,7 +641,7 @@ vfprintf (_FILE *stream, /**< stream pointer */ case 'A': { /* Not supported */ - JERRY_UNREACHABLE (); + LIBC_UNREACHABLE (); break; } @@ -648,7 +650,7 @@ vfprintf (_FILE *stream, /**< stream pointer */ if (length & LIBC_PRINTF_ARG_LENGTH_TYPE_L) { /* Not supported */ - JERRY_UNREACHABLE (); + LIBC_UNREACHABLE (); } else { @@ -672,7 +674,7 @@ vfprintf (_FILE *stream, /**< stream pointer */ if (length & LIBC_PRINTF_ARG_LENGTH_TYPE_L) { /* Not supported */ - JERRY_UNREACHABLE (); + LIBC_UNREACHABLE (); } else { @@ -713,7 +715,7 @@ vfprintf (_FILE *stream, /**< stream pointer */ case 'n': { /* Not supported */ - JERRY_UNREACHABLE (); + LIBC_UNREACHABLE (); break; } } @@ -733,9 +735,9 @@ vfprintf (_FILE *stream, /**< stream pointer */ * @return number of characters printed */ int -fprintf (_FILE *stream, /**< stream pointer */ - const char *format, /**< format string */ - ...) /**< parameters' values */ +fprintf (FILE *stream, /**< stream pointer */ + const char *format, /**< format string */ + ...) /**< parameters' values */ { va_list args; @@ -755,13 +757,13 @@ fprintf (_FILE *stream, /**< stream pointer */ */ int printf (const char *format, /**< format string */ - ...) /**< parameters' values */ + ...) /**< parameters' values */ { va_list args; va_start (args, format); - int ret = vfprintf (LIBC_STDOUT, format, args); + int ret = vfprintf (stdout, format, args); va_end (args); diff --git a/jerry-libc/jerry-libc.cpp b/jerry-libc/jerry-libc.c similarity index 93% rename from jerry-libc/jerry-libc.cpp rename to jerry-libc/jerry-libc.c index bd716482a..6fdafad95 100644 --- a/jerry-libc/jerry-libc.cpp +++ b/jerry-libc/jerry-libc.c @@ -17,23 +17,21 @@ * Jerry libc's common functions implementation */ -#include "jerry-libc.h" +#include +#include +#include +#include + +#include "jerry-libc-defs.h" /** - * Unreachable stubs for routines that are never called, - * but referenced from third-party libraries. + * Standard file descriptors */ -#define JRT_UNREACHABLE_STUB_FOR(...) \ - extern "C" __VA_ARGS__; \ -__used __VA_ARGS__ \ -{ \ - JERRY_UNREACHABLE (); \ -} +FILE *stdin = (FILE*) 0; +FILE *stdout = (FILE*) 1; +FILE *stderr = (FILE*) 2; -JRT_UNREACHABLE_STUB_FOR(void abort (void)) -JRT_UNREACHABLE_STUB_FOR(int raise (int sig_no __unused)) - -#undef JRT_UNREACHABLE_STUB_FOR +LIBC_UNREACHABLE_STUB_FOR(void abort (void)) #ifdef __GNUC__ /* @@ -42,6 +40,8 @@ JRT_UNREACHABLE_STUB_FOR(int raise (int sig_no __unused)) * - memset -> call to memset; * - memmove -> call to memmove. */ +#define CALL_PRAGMA(x) _Pragma (#x) + CALL_PRAGMA(GCC diagnostic push) CALL_PRAGMA(GCC diagnostic ignored "-Wpragmas") CALL_PRAGMA(GCC push_options) @@ -53,7 +53,7 @@ CALL_PRAGMA(GCC optimize ("-fno-tree-loop-distribute-patterns")) * * @return @s */ -void* +void* __attr_used___ // FIXME memset (void *s, /**< area to set values in */ int c, /**< value to set */ size_t n) /**< area size */ @@ -119,7 +119,7 @@ memcpy (void *s1, /**< destination */ * * @return the dest pointer's value */ -void * +void * __attr_used___ // FIXME memmove (void *s1, /**< destination */ const void *s2, /**< source */ size_t n) /**< bytes number */ @@ -233,7 +233,7 @@ strncmp (const char *s1, const char *s2, size_t n) /** Copy a string. At most n bytes of src are copied. Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated. @return a pointer to the destination string dest. */ -char * +char * __attr_used___ // FIXME strncpy (char *dest, const char *src, size_t n) { size_t i; diff --git a/jerry-libc/jerry-libc.h b/jerry-libc/jerry-libc.h deleted file mode 100644 index 39dcbd2b8..000000000 --- a/jerry-libc/jerry-libc.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright 2014-2015 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Jerry libc declarations - */ -#ifndef JERRY_LIBC_H -#define JERRY_LIBC_H - -#include "jrt.h" - -typedef void _FILE; - -/** - * stdin file descriptor - */ -#define LIBC_STDIN (_FILE*)0 - -/** - * stdout file descriptor - */ -#define LIBC_STDOUT (_FILE*)1 - -/** - * stderr file descriptor - */ -#define LIBC_STDERR (_FILE*)2 - -extern void* memset (void *s, int c, size_t n); -extern int memcmp (const void *s1, const void *s2, size_t n); -extern void* memcpy (void *s1, const void *s2, size_t n); -extern void* memmove (void *dest, const void *src, size_t n); -extern int printf (const char *format, ...); -extern int putchar (int); -extern "C" void __noreturn exit (int); - -extern int strcmp (const char *, const char *); -extern int strncmp (const char *, const char *, size_t); -extern char* strncpy (char *, const char *, size_t); -extern float __strtof (const char *, char **); -extern size_t strlen (const char *); - -extern int isspace (int); -extern int isupper (int); -extern int islower (int); -extern int isalpha (int); -extern int isdigit (int); -extern int isxdigit (int); - -/** - * 'whence' argument of fseek that identifies position - * the 'offset' argument is added to. - */ -typedef enum -{ - __SEEK_SET, /**< relative to begin of file */ - __SEEK_CUR, /**< relative to current position */ - __SEEK_END /**< relative to end of file */ -} _whence_t; - -extern _FILE* fopen (const char *, const char *); -extern int fclose (_FILE *); -extern int fseek (_FILE *, long offset, _whence_t); -extern long ftell (_FILE *); -extern void rewind (_FILE *); -extern size_t fread (void *, size_t, size_t, _FILE *); -extern size_t fwrite (const void *, size_t, size_t, _FILE *); -extern int fprintf (_FILE *, const char *, ...); - -extern void jrt_set_mem_limits (size_t data_size, size_t stack_size); - -#define HUGE_VAL (1e37f) - -#endif /* JERRY_LIBC_H */ diff --git a/jerry-libc/target/linux/jerry-libc.cpp b/jerry-libc/target/linux/jerry-libc-target.c similarity index 76% rename from jerry-libc/target/linux/jerry-libc.cpp rename to jerry-libc/target/linux/jerry-libc-target.c index 6febefa44..4a9b70f5c 100644 --- a/jerry-libc/target/linux/jerry-libc.cpp +++ b/jerry-libc/target/linux/jerry-libc-target.c @@ -17,12 +17,17 @@ * Jerry libc platform-specific functions linux implementation */ -#include "jrt.h" -#include "jerry-libc.h" - +#include +#include +#include #include - +#include +#include +#include +#include #include +#include +#include #ifdef __TARGET_HOST_x64 # include "asm_x64.h" @@ -33,46 +38,33 @@ #else /* !__TARGET_HOST_x64 && !__TARGET_HOST_x86 && !__TARGET_HOST_ARMv7 */ # error "!__TARGET_HOST_x64 && !__TARGET_HOST_x86 && !__TARGET_HOST_ARMv7 " #endif /* !__TARGET_HOST_x64 && !__TARGET_HOST_x86 && !__TARGET_HOST_ARMv7 */ +#include "jerry-libc-defs.h" -FIXME(Rename __unused) -#undef __unused - -#include -#include -#include - -FIXME (/* Include linux/fs.h */) - -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 +LIBC_UNREACHABLE_STUB_FOR(int raise (int sig_no __attr_unused___)) /** * Exit program with ERR_SYSCALL if syscall_ret_val is negative */ #define LIBC_EXIT_ON_ERROR(syscall_ret_val) \ - if (unlikely ((syscall_ret_val) < 0)) \ + if ((syscall_ret_val) < 0) \ { \ - jerry_fatal (ERR_SYSCALL); \ + libc_fatal ("Syscall successful", __FILE__, __FUNCTION__, __LINE__); \ } static long int syscall_1 (long int syscall_no, long int arg1); static long int syscall_2 (long int syscall_no, long int arg1, long int arg2); static long int syscall_3 (long int syscall_no, long int arg1, long int arg2, long int arg3); -extern "C" -{ - extern long int syscall_1_asm (long int syscall_no, long int arg1); - extern long int syscall_2_asm (long int syscall_no, long int arg1, long int arg2); - extern long int syscall_3_asm (long int syscall_no, long int arg1, long int arg2, long int arg3); -} +extern long int syscall_1_asm (long int syscall_no, long int arg1); +extern long int syscall_2_asm (long int syscall_no, long int arg1, long int arg2); +extern long int syscall_3_asm (long int syscall_no, long int arg1, long int arg2, long int arg3); /** * System call with one argument. * * @return syscall's return value */ -static __noinline long int +static __attr_noinline___ long int syscall_1 (long int syscall_no, /**< syscall number */ long int arg1) /**< argument */ { @@ -88,7 +80,7 @@ syscall_1 (long int syscall_no, /**< syscall number */ * * @return syscall's return value */ -static __noinline long int +static __attr_noinline___ long int syscall_2 (long int syscall_no, /**< syscall number */ long int arg1, /**< first argument */ long int arg2) /**< second argument */ @@ -105,7 +97,7 @@ syscall_2 (long int syscall_no, /**< syscall number */ * * @return syscall's return value */ -static __noinline long int +static __attr_noinline___ long int syscall_3 (long int syscall_no, /**< syscall number */ long int arg1, /**< first argument */ long int arg2, /**< second argument */ @@ -122,20 +114,36 @@ syscall_3 (long int syscall_no, /**< syscall number */ int putchar (int c) { - fwrite (&c, 1, sizeof (char), LIBC_STDOUT); + fwrite (&c, 1, sizeof (char), stdout); return c; } /* putchar */ +/** + * Output specified string + */ +int +puts(const char *s) /**< string to print */ +{ + while (*s) + { + putchar (*s); + + s++; + } + + return 0; +} /* puts */ + /** * Exit - cause normal process termination with specified status code */ -void __noreturn __used +void __attr_noreturn___ __attr_used___ exit (int status) /**< status code */ { - syscall_1 (__NR_close, (long int)LIBC_STDIN); - syscall_1 (__NR_close, (long int)LIBC_STDOUT); - syscall_1 (__NR_close, (long int)LIBC_STDERR); + syscall_1 (__NR_close, (long int)stdin); + syscall_1 (__NR_close, (long int)stdout); + syscall_1 (__NR_close, (long int)stderr); syscall_1 (__NR_exit_group, status); @@ -148,12 +156,12 @@ exit (int status) /**< status code */ /** * fopen * - * @return _FILE pointer - upon successful completion, + * @return FILE pointer - upon successful completion, * NULL - otherwise */ -_FILE* +FILE* fopen (const char *path, /**< file path */ - const char *mode) /**< file open mode */ + const char *mode) /**< file open mode */ { bool may_read = false; bool may_write = false; @@ -161,8 +169,8 @@ fopen (const char *path, /**< file path */ bool create_if_not_exist = false; bool position_at_end = false; - JERRY_ASSERT(path != NULL && mode != NULL); - JERRY_ASSERT(mode[1] == '+' || mode[1] == '\0'); + LIBC_ASSERT(path != NULL && mode != NULL); + LIBC_ASSERT(mode[1] == '+' || mode[1] == '\0'); switch (mode[0]) { @@ -188,13 +196,13 @@ fopen (const char *path, /**< file path */ if (mode[1] == '+') { /* Not supported */ - JERRY_UNREACHABLE(); + LIBC_UNREACHABLE(); } break; } default: { - JERRY_UNREACHABLE(); + LIBC_UNREACHABLE(); } } @@ -210,7 +218,7 @@ fopen (const char *path, /**< file path */ } else { - JERRY_ASSERT(may_read && may_write); + LIBC_ASSERT(may_read && may_write); flags = O_RDWR; } @@ -240,7 +248,7 @@ fopen (const char *path, /**< file path */ * for the stream pointed to by STREAM to the beginning of the file. */ void -rewind (_FILE *stream) /**< stream pointer */ +rewind (FILE *stream) /**< stream pointer */ { syscall_3 (__NR_lseek, (long int) stream, 0, SEEK_SET); } /* rewind */ @@ -252,7 +260,7 @@ rewind (_FILE *stream) /**< stream pointer */ * non-zero value - otherwise. */ int -fclose (_FILE *fp) /**< stream pointer */ +fclose (FILE *fp) /**< stream pointer */ { syscall_2 (__NR_close, (long int)fp, 0); @@ -263,32 +271,12 @@ fclose (_FILE *fp) /**< stream pointer */ * fseek */ int -fseek (_FILE * fp, /**< stream pointer */ - long offset, /**< offset */ - _whence_t whence) /**< specifies position type - to add offset to */ +fseek (FILE * fp, /**< stream pointer */ + long offset, /**< offset */ + int whence) /**< specifies position type + * to add offset to */ { - int whence_real = SEEK_CUR; - switch (whence) - { - case __SEEK_SET: - { - whence_real = SEEK_SET; - break; - } - case __SEEK_CUR: - { - whence_real = SEEK_CUR; - break; - } - case __SEEK_END: - { - whence_real = SEEK_END; - break; - } - } - - syscall_3 (__NR_lseek, (long int)fp, offset, whence_real); + syscall_3 (__NR_lseek, (long int)fp, offset, whence); return 0; } /* fseek */ @@ -297,7 +285,7 @@ fseek (_FILE * fp, /**< stream pointer */ * ftell */ long -ftell (_FILE * fp) /**< stream pointer */ +ftell (FILE * fp) /**< stream pointer */ { long int ret = syscall_3 (__NR_lseek, (long int)fp, 0, SEEK_CUR); @@ -311,9 +299,9 @@ ftell (_FILE * fp) /**< stream pointer */ */ size_t fread (void *ptr, /**< address of buffer to read to */ - size_t size, /**< size of elements to read */ - size_t nmemb, /**< number of elements to read */ - _FILE *stream) /**< stream pointer */ + size_t size, /**< size of elements to read */ + size_t nmemb, /**< number of elements to read */ + FILE *stream) /**< stream pointer */ { long int ret; size_t bytes_read = 0; @@ -339,9 +327,9 @@ fread (void *ptr, /**< address of buffer to read to */ */ size_t fwrite (const void *ptr, /**< data to write */ - size_t size, /**< size of elements to write */ - size_t nmemb, /**< number of elements */ - _FILE *stream) /**< stream pointer */ + size_t size, /**< size of elements to write */ + size_t nmemb, /**< number of elements */ + FILE *stream) /**< stream pointer */ { size_t bytes_written = 0; @@ -359,6 +347,8 @@ fwrite (const void *ptr, /**< data to write */ return bytes_written; } /* fwrite */ +// FIXME +#if 0 /** * Setup new memory limits */ @@ -382,19 +372,20 @@ jrt_set_mem_limits (size_t data_size, /**< limit for data + bss + brk heap */ #ifdef __TARGET_HOST_x64 ret = syscall_2 (__NR_setrlimit, RLIMIT_DATA, (intptr_t) &data_limit); - JERRY_ASSERT (ret == 0); + LIBC_ASSERT (ret == 0); ret = syscall_2 (__NR_setrlimit, RLIMIT_STACK, (intptr_t) &stack_limit); - JERRY_ASSERT (ret == 0); + LIBC_ASSERT (ret == 0); #elif defined (__TARGET_HOST_ARMv7) ret = syscall_3 (__NR_prlimit64, 0, RLIMIT_DATA, (intptr_t) &data_limit); - JERRY_ASSERT (ret == 0); + LIBC_ASSERT (ret == 0); ret = syscall_3 (__NR_prlimit64, 0, RLIMIT_STACK, (intptr_t) &stack_limit); - JERRY_ASSERT (ret == 0); + LIBC_ASSERT (ret == 0); #elif defined (__TARGET_HOST_x86) # error "__TARGET_HOST_x86 case is not implemented" #else /* !__TARGET_HOST_x64 && !__TARGET_HOST_ARMv7 && !__TARGET_HOST_x86 */ # error "!__TARGET_HOST_x64 && !__TARGET_HOST_ARMv7 && !__TARGET_HOST_x86" #endif /* !__TARGET_HOST_x64 && !__TARGET_HOST_ARMv7 && !__TARGET_HOST_x86 */ } /* jrt_set_mem_limits */ +#endif // FIXME diff --git a/jerry-libc/target/stm32f3/jerry-libc.cpp b/jerry-libc/target/mcu-stubs/jerry-libc-target.c similarity index 58% rename from jerry-libc/target/stm32f3/jerry-libc.cpp rename to jerry-libc/target/mcu-stubs/jerry-libc-target.c index 9077e8ba5..fea7fd1d9 100644 --- a/jerry-libc/target/stm32f3/jerry-libc.cpp +++ b/jerry-libc/target/mcu-stubs/jerry-libc-target.c @@ -1,4 +1,4 @@ -/* Copyright 2014-2015 Samsung Electronics Co., Ltd. +/* Copyright 2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,27 +17,22 @@ * Jerry libc platform-specific functions stm32f4 implementation */ -#include "jerry-libc.h" +#include +#include -#include - -extern void __noreturn exit (int status); +#include "jerry-libc-defs.h" /** Output of character. Writes the character c, cast to an unsigned char, to stdout. */ int -putchar (int c) +putchar (int c __attr_unused___) { - JERRY_UNIMPLEMENTED_REF_UNUSED_VARS("putchar is not implemented for STM32F3.", c); + return 1; } /* putchar */ /** exit - cause normal process termination */ -void __noreturn __used -exit (int status __unused) +void __attr_noreturn___ __attr_used___ +exit (int status __attr_unused___) { - /** - * TODO: Blink LEDs? status -> binary -> LEDs? - */ - while (true) { } @@ -49,11 +44,11 @@ exit (int status __unused) * @return number of bytes written */ size_t -fwrite (const void *ptr, /**< data to write */ - size_t size, /**< size of elements to write */ - size_t nmemb, /**< number of elements */ - _FILE *stream) /**< stream pointer */ +fwrite (const void *ptr __attr_unused___, /**< data to write */ + size_t size, /**< size of elements to write */ + size_t nmemb, /**< number of elements */ + FILE *stream __attr_unused___) /**< stream pointer */ { - JERRY_UNIMPLEMENTED_REF_UNUSED_VARS("fwrite is not implemented for STM32F3.", ptr, size, nmemb, stream); + return size * nmemb; } /* fwrite */ diff --git a/jerry-libc/target/stm32f4/jerry-libc.cpp b/jerry-libc/target/stm32f4/jerry-libc.cpp deleted file mode 100644 index c4392bc0e..000000000 --- a/jerry-libc/target/stm32f4/jerry-libc.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright 2014-2015 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Jerry libc platform-specific functions stm32f4 implementation - */ - -#include "jerry-libc.h" - -#include - -extern void __noreturn exit (int status); - -/** Output of character. Writes the character c, cast to an unsigned char, to stdout. */ -int -putchar (int c) -{ - JERRY_UNIMPLEMENTED_REF_UNUSED_VARS("putchar is not implemented for STM32F4.", c); -} /* putchar */ - -/** exit - cause normal process termination */ -void __noreturn __used -exit (int status __unused) -{ - /** - * TODO: Blink LEDs? status -> binary -> LEDs? - */ - - while (true) - { - } -} /* exit */ - -/** - * fwrite - * - * @return number of bytes written - */ -size_t -fwrite (const void *ptr, /**< data to write */ - size_t size, /**< size of elements to write */ - size_t nmemb, /**< number of elements */ - _FILE *stream) /**< stream pointer */ -{ - JERRY_UNIMPLEMENTED_REF_UNUSED_VARS("fwrite is not implemented for STM32F4.", ptr, size, nmemb, stream); -} /* fwrite */ - diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt new file mode 100644 index 000000000..833436c72 --- /dev/null +++ b/plugins/CMakeLists.txt @@ -0,0 +1,112 @@ +# Copyright 2015 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required (VERSION 2.8.12) +project (Jerry_Plugins CXX ASM) + +# Compiler / linker flags + set(COMPILE_FLAGS_PLUGINS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY}") + +# Definitions + # Debug + set(DEFINES_PLUGINS_DEBUG ) + + # Release + set(DEFINES_PLUGINS_RELEASE JERRY_NDEBUG) + + # Platform-specific + # Linux + set(DEFINES_PLUGINS_LINUX __TARGET_HOST) + # MCU + # stm32f3 + set(DEFINES_PLUGINS_MCU_STM32F3 __TARGET_MCU __TARGET_MCU_STM32F3) + # stm32f4 + set(DEFINES_PLUGINS_MCU_STM32F4 __TARGET_MCU __TARGET_MCU_STM32F4) + +# Include directories + set(INCLUDE_PLUGINS + ${CMAKE_SOURCE_DIR}/src + lib-device-stm) + + # Third-party + # Platform-specific + # Linux + set(INCLUDE_THIRD_PARTY_LINUX ) + + # MCU + # STM32F3 + set(INCLUDE_THIRD_PARTY_MCU_STM32F3 + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Include + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/inc + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Include + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0) + # STM32F4 + set(INCLUDE_THIRD_PARTY_MCU_STM32F4 + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/inc + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/Include + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0) + +# Sources + file(GLOB SOURCE_PLUGINS lib-device-stm/*.cpp) + + # Third-party + # Platform-specific + # MCU + # stm32f3 + set(SOURCE_THIRD_PARTY_MCU_STM32F3 + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/CMSIS/Device/ST/STM32F30x/Source/Templates/system_stm32f30x.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/src/stm32f30x_tim.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/src/stm32f30x_gpio.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F3-Discovery_FW_V1.1.0/Libraries/STM32F30x_StdPeriph_Driver/src/stm32f30x_rcc.c) + # stm32f4 + set(SOURCE_THIRD_PARTY_MCU_STM32F4 + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_tim.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c + ${CMAKE_SOURCE_DIR}/third-party/STM32F4-Discovery_FW_V1.1.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c) + +# Platform-specific configuration + set(DEFINES_PLUGINS ${DEFINES_PLUGINS_${PLATFORM_EXT}}) + set(INCLUDE_PLUGINS ${INCLUDE_PLUGINS} ${INCLUDE_THIRD_PARTY_${PLATFORM_EXT}}) + +# Targets declaration + string(TOLOWER ${PLATFORM_EXT} PLATFORM_L) + set(TARGET_NAME plugins.${PLATFORM_L}) + + function(declare_targets_for_build_mode BUILD_MODE) + set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}.${TARGET_NAME}) + set(DEFINES_PLUGINS ${DEFINES_PLUGINS} ${DEFINES_PLUGINS_${BUILD_MODE}}) + + # Jerry + add_library(${TARGET_NAME}.lib STATIC ${SOURCE_PLUGINS}) + set_property(TARGET ${TARGET_NAME}.lib + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_PLUGINS} ${FLAGS_COMMON_${BUILD_MODE}}") + target_compile_definitions(${TARGET_NAME}.lib PRIVATE ${DEFINES_PLUGINS}) + target_include_directories(${TARGET_NAME}.lib PRIVATE ${INCLUDE_PLUGINS}) + + # Third-party MCU library + if(DEFINED SOURCE_THIRD_PARTY_${PLATFORM_EXT}) + add_library(${TARGET_NAME}.third_party.lib STATIC ${SOURCE_THIRD_PARTY_${PLATFORM_EXT}}) + set_property(TARGET ${TARGET_NAME}.third_party.lib + PROPERTY COMPILE_FLAGS "${FLAGS_COMMON_${BUILD_MODE}}") + target_include_directories(${TARGET_NAME}.third_party.lib PRIVATE ${INCLUDE_PLUGINS}) + + target_link_libraries(${TARGET_NAME}.lib ${TARGET_NAME}.third_party.lib) + endif() + endfunction() + + foreach(BUILD_MODE ${BUILD_MODES}) + declare_targets_for_build_mode(${BUILD_MODE}) + endforeach() diff --git a/plugins/lib-device-stm/actuators.cpp b/plugins/lib-device-stm/actuators.cpp index 856e93350..9387d259e 100644 --- a/plugins/lib-device-stm/actuators.cpp +++ b/plugins/lib-device-stm/actuators.cpp @@ -15,9 +15,10 @@ #pragma GCC optimize "O0" +#include + #include "actuators.h" #include "common-io.h" -#include "jerry-libc.h" #ifdef __TARGET_HOST /** diff --git a/plugins/lib-device-stm/actuators.h b/plugins/lib-device-stm/actuators.h index 5fa455491..01dbc70cc 100644 --- a/plugins/lib-device-stm/actuators.h +++ b/plugins/lib-device-stm/actuators.h @@ -16,7 +16,7 @@ #ifndef ACTUATORS_H #define ACTUATORS_H -#include "jrt.h" +#include void led_toggle (uint32_t); void led_on (uint32_t); diff --git a/plugins/lib-device-stm/common-io.cpp b/plugins/lib-device-stm/common-io.cpp index 86baf7c77..18081602b 100644 --- a/plugins/lib-device-stm/common-io.cpp +++ b/plugins/lib-device-stm/common-io.cpp @@ -15,34 +15,43 @@ #pragma GCC optimize "O0" +#include + #include "actuators.h" #include "common-io.h" -#include "jerry-libc.h" #include "mcu-headers.h" int -digital_read (uint32_t arg1 __unused, uint32_t arg2 __unused) +digital_read (uint32_t arg1, uint32_t arg2) { - JERRY_UNIMPLEMENTED ("Digital read operation is not implemented."); + (void) arg1; + (void) arg2; + + return 0; } void -digital_write (uint32_t arg1 __unused, uint32_t arg2 __unused) +digital_write (uint32_t arg1, uint32_t arg2) { - JERRY_UNIMPLEMENTED ("Digital write operation is not implemented."); + (void) arg1; + (void) arg2; } int -analog_read (uint32_t arg1 __unused, uint32_t arg2 __unused) +analog_read (uint32_t arg1, uint32_t arg2) { - JERRY_UNIMPLEMENTED ("Analog read operation is not implemented."); + (void) arg1; + (void) arg2; + + return 0; } void -analog_write (uint32_t arg1 __unused, uint32_t arg2 __unused) +analog_write (uint32_t arg1, uint32_t arg2) { - JERRY_UNIMPLEMENTED ("Analog write operation is not implemented."); + (void) arg1; + (void) arg2; } #ifdef __TARGET_HOST diff --git a/plugins/lib-device-stm/common-io.h b/plugins/lib-device-stm/common-io.h index 85ae9c507..646b76e61 100644 --- a/plugins/lib-device-stm/common-io.h +++ b/plugins/lib-device-stm/common-io.h @@ -16,7 +16,7 @@ #ifndef COMMON_IO_H #define COMMON_IO_H -#include "jrt.h" +#include int digital_read (uint32_t, uint32_t); void digital_write (uint32_t, uint32_t); diff --git a/plugins/lib-device-stm/sensors.cpp b/plugins/lib-device-stm/init.cpp similarity index 59% rename from plugins/lib-device-stm/sensors.cpp rename to plugins/lib-device-stm/init.cpp index 671ecfb62..43cec6778 100644 --- a/plugins/lib-device-stm/sensors.cpp +++ b/plugins/lib-device-stm/init.cpp @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,16 @@ * limitations under the License. */ -#pragma GCC optimize "O0" +#include "actuators.h" +#include "common-io.h" +#include "init.h" -#include "sensors.h" +void +plugin_device_stm_init (void) +{ +#if defined (__TARGET_MCU_STM32F3) || defined (__TARGET_MCU_STM32F4) + initialize_sys_tick (); + initialize_leds (); + initialize_timer (); +#endif /* __TARGET_MCU_STM32F3 || __TARGET_MCU_STM32F4 */ +} /* plugin_device_stm_init */ diff --git a/plugins/lib-device-stm/sensors.h b/plugins/lib-device-stm/init.h similarity index 80% rename from plugins/lib-device-stm/sensors.h rename to plugins/lib-device-stm/init.h index 0aeb25b4b..ca7ea4f39 100644 --- a/plugins/lib-device-stm/sensors.h +++ b/plugins/lib-device-stm/init.h @@ -1,4 +1,4 @@ -/* Copyright 2014-2015 Samsung Electronics Co., Ltd. +/* Copyright 2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * limitations under the License. */ -#ifndef SENSORS_H -#define SENSORS_H +#ifndef INIT_H +#define INIT_H -#include "jrt.h" +extern void plugin_device_stm_init (void); -#endif /* SENSORS_H */ +#endif /* INIT_H */ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..58dcb1e80 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,146 @@ +# Copyright 2015 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required (VERSION 2.8.12) +project (JerryCore CXX C ASM) + +# Definitions + # Get version information from git + execute_process(COMMAND git symbolic-ref -q HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE JERRY_GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND git rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE JERRY_GIT_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) + # Get build date + execute_process(COMMAND date +%d/%m/%Y + OUTPUT_VARIABLE JERRY_BUILD_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(DEFINES_JERRY + JERRY_BUILD_DATE="${JERRY_BUILD_DATE}" + JERRY_COMMIT_HASH="${JERRY_GIT_COMMIT}" + JERRY_BRANCH_NAME="${JERRY_GIT_BRANCH}") + + # Build modes + # Debug + set(DEFINES_JERRY_DEBUG JERRY_ENABLE_PRETTY_PRINTER) + + # Release + set(DEFINES_JERRY_RELEASE JERRY_NDEBUG) + + # Modifiers + # Full profile + set(DEFINES_FULL_PROFILE CONFIG_ECMA_NUMBER_TYPE=CONFIG_ECMA_NUMBER_FLOAT64) + + # Compact profile + set(DEFINES_COMPACT_PROFILE + CONFIG_ECMA_COMPACT_PROFILE) + + # Minimal compact profile + set(DEFINES_COMPACT_PROFILE_MINIMAL + CONFIG_ECMA_COMPACT_PROFILE + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_STRING_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ERROR_BUILTINS + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ARRAY_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_MATH_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_DATE_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_JSON_BUILTIN + CONFIG_ECMA_COMPACT_PROFILE_DISABLE_REGEXP_BUILTIN) + + # Memory statistics + set(DEFINES_JERRY_MEMORY_STATISTICS MEM_STATS) + + # Valgrind + set(DEFINES_JERRY_VALGRIND JERRY_VALGRIND) + + # Platform-specific + # Linux + # MCU + math(EXPR MEM_HEAP_AREA_SIZE_16K "16 * 1024") + set(DEFINES_JERRY_MCU CONFIG_MEM_HEAP_AREA_SIZE=${MEM_HEAP_AREA_SIZE_16K}) + +# Include directories + set(INCLUDE_CORE + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/src/mem + ${CMAKE_SOURCE_DIR}/src/vm + ${CMAKE_SOURCE_DIR}/src/ecma/builtin-objects + ${CMAKE_SOURCE_DIR}/src/ecma/base + ${CMAKE_SOURCE_DIR}/src/ecma/operations + ${CMAKE_SOURCE_DIR}/src/parser/collections + ${CMAKE_SOURCE_DIR}/src/parser/js + ${CMAKE_SOURCE_DIR}/src/jrt) + + # Third-party + # Valgrind + set(INCLUDE_THIRD_PARTY_VALGRIND ${CMAKE_SOURCE_DIR}/third-party/valgrind) + +# Sources + # Jerry core + file(GLOB SOURCE_CORE_MEM mem/*.cpp) + file(GLOB SOURCE_CORE_VM vm/*.cpp) + file(GLOB SOURCE_CORE_ECMA_BUILTINS ecma/builtin-objects/*.cpp) + file(GLOB SOURCE_CORE_ECMA_BASE ecma/base/*.cpp) + file(GLOB SOURCE_CORE_ECMA_OPERATIONS ecma/operations/*.cpp) + file(GLOB SOURCE_CORE_PARSER_COLLECTIONS parser/collections/*.cpp) + file(GLOB SOURCE_CORE_PARSER_JS parser/js/*.cpp) + file(GLOB SOURCE_CORE_JRT jrt/*.cpp) + + set(SOURCE_CORE + jerry.cpp + ${SOURCE_CORE_MEM} + ${SOURCE_CORE_VM} + ${SOURCE_CORE_ECMA_BUILTINS} + ${SOURCE_CORE_ECMA_BASE} + ${SOURCE_CORE_ECMA_OPERATIONS} + ${SOURCE_CORE_PARSER_COLLECTIONS} + ${SOURCE_CORE_PARSER_JS} + ${SOURCE_CORE_JRT}) + +# Platform-specific configuration + set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_${PLATFORM}}) + +# Targets declaration + function(declare_targets_for_build_mode BUILD_MODE) + set(TARGET_NAME ${BUILD_MODE_PREFIX_${BUILD_MODE}}) + set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_JERRY_${BUILD_MODE}}) + + function(declare_target_with_modifiers ) # modifiers are passed in ARGN implicit argument + foreach(MODIFIER ${ARGN}) + set(TARGET_NAME ${TARGET_NAME}${MODIFIER_SUFFIX_${MODIFIER}}) + set(DEFINES_JERRY ${DEFINES_JERRY} ${DEFINES_${MODIFIER}}) + endforeach() + + add_library(${TARGET_NAME}.jerry-core STATIC ${SOURCE_CORE}) + set_property(TARGET ${TARGET_NAME}.jerry-core + PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_JERRY} ${CXX_FLAGS_JERRY} ${FLAGS_COMMON_${BUILD_MODE}}") + target_compile_definitions(${TARGET_NAME}.jerry-core PRIVATE ${DEFINES_JERRY}) + target_include_directories(${TARGET_NAME}.jerry-core PRIVATE ${INCLUDE_CORE}) + endfunction() + + foreach(MODIFIERS_LIST ${MODIFIERS_LISTS}) + separate_arguments(MODIFIERS_LIST) + + declare_target_with_modifiers(${MODIFIERS_LIST}) + endforeach() + endfunction() + + foreach(BUILD_MODE ${BUILD_MODES}) + declare_targets_for_build_mode(${BUILD_MODE}) + endforeach() diff --git a/src/ecma/base/ecma-gc.cpp b/src/ecma/base/ecma-gc.cpp index f631a3704..44a62bf68 100644 --- a/src/ecma/base/ecma-gc.cpp +++ b/src/ecma/base/ecma-gc.cpp @@ -31,7 +31,7 @@ #include "ecma-lcache.h" #include "ecma-stack.h" #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "jrt-bit-fields.h" /** diff --git a/src/ecma/base/ecma-globals.h b/src/ecma/base/ecma-globals.h index c93578f38..752fb9faa 100644 --- a/src/ecma/base/ecma-globals.h +++ b/src/ecma/base/ecma-globals.h @@ -284,7 +284,7 @@ typedef struct ecma_property_t union { /** Description of named data property */ - struct __packed ecma_named_data_property_t + struct __attr_packed___ ecma_named_data_property_t { /** Compressed pointer to property's name (pointer to String) */ unsigned int name_p : ECMA_POINTER_FIELD_WIDTH; @@ -306,7 +306,7 @@ typedef struct ecma_property_t } named_data_property; /** Description of named accessor property */ - struct __packed ecma_named_accessor_property_t + struct __attr_packed___ ecma_named_accessor_property_t { /** Compressed pointer to property's name (pointer to String) */ unsigned int name_p : ECMA_POINTER_FIELD_WIDTH; @@ -328,7 +328,7 @@ typedef struct ecma_property_t } named_accessor_property; /** Description of internal property */ - struct __packed ecma_internal_property_t + struct __attr_packed___ ecma_internal_property_t { /** Internal property's type */ unsigned int type : ECMA_PROPERTY_INTERNAL_PROPERTY_TYPE_WIDTH; diff --git a/src/ecma/base/ecma-helpers-conversion.cpp b/src/ecma/base/ecma-helpers-conversion.cpp index 65e0ea146..df34932b7 100644 --- a/src/ecma/base/ecma-helpers-conversion.cpp +++ b/src/ecma/base/ecma-helpers-conversion.cpp @@ -22,7 +22,7 @@ #include "ecma-globals.h" #include "ecma-helpers.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" /* * \addtogroup ecmahelpersbigintegers Helpers for operations intermediate 128-bit integers diff --git a/src/ecma/base/ecma-helpers-string.cpp b/src/ecma/base/ecma-helpers-string.cpp index ab5c6c373..8415b8ea1 100644 --- a/src/ecma/base/ecma-helpers-string.cpp +++ b/src/ecma/base/ecma-helpers-string.cpp @@ -27,7 +27,7 @@ #include "ecma-helpers.h" #include "ecma-lcache.h" #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "vm.h" /** @@ -987,7 +987,7 @@ ecma_string_to_zt_string (const ecma_string_t *string_desc_p, /**< ecma-string d * @return true - if strings are equal; * false - otherwise. */ -static bool __noinline +static bool __attr_noinline___ ecma_compare_ecma_strings_longpath (const ecma_string_t *string1_p, /* ecma-string */ const ecma_string_t *string2_p) /* ecma-string */ { diff --git a/src/ecma/base/ecma-helpers-value.cpp b/src/ecma/base/ecma-helpers-value.cpp index e6bfd79ea..c107b9561 100644 --- a/src/ecma/base/ecma-helpers-value.cpp +++ b/src/ecma/base/ecma-helpers-value.cpp @@ -34,7 +34,7 @@ JERRY_STATIC_ASSERT (sizeof (ecma_value_t) * JERRY_BITSINBYTE == ECMA_VALUE_SIZE * * @return type field */ -static ecma_type_t __attribute_pure__ +static ecma_type_t __attr_pure___ ecma_get_value_type_field (const ecma_value_t& value) /**< ecma-value */ { return (ecma_type_t) jrt_extract_bit_field (value, @@ -47,7 +47,7 @@ ecma_get_value_type_field (const ecma_value_t& value) /**< ecma-value */ * * @return value field */ -static uintptr_t __attribute_pure__ +static uintptr_t __attr_pure___ ecma_get_value_value_field (const ecma_value_t& value) /**< ecma-value */ { return (uintptr_t) jrt_extract_bit_field (value, @@ -60,7 +60,7 @@ ecma_get_value_value_field (const ecma_value_t& value) /**< ecma-value */ * * @return ecma-value with updated field */ -static ecma_value_t __attribute_pure__ +static ecma_value_t __attr_pure___ ecma_set_value_type_field (const ecma_value_t& value, /**< ecma-value to set field in */ ecma_type_t type_field) /**< new field value */ { @@ -75,7 +75,7 @@ ecma_set_value_type_field (const ecma_value_t& value, /**< ecma-value to set fie * * @return ecma-value with updated field */ -static ecma_value_t __attribute_pure__ +static ecma_value_t __attr_pure___ ecma_set_value_value_field (const ecma_value_t& value, /**< ecma-value to set field in */ uintptr_t value_field) /**< new field value */ { @@ -91,7 +91,7 @@ ecma_set_value_value_field (const ecma_value_t& value, /**< ecma-value to set fi * @return true - if the value contains implementation-defined empty simple value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_empty (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE @@ -104,7 +104,7 @@ ecma_is_value_empty (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains ecma-undefined simple value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_undefined (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE @@ -117,7 +117,7 @@ ecma_is_value_undefined (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains ecma-null simple value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_null (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE @@ -130,7 +130,7 @@ ecma_is_value_null (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains ecma-true or ecma-false simple values, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_boolean (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE @@ -147,7 +147,7 @@ ecma_is_value_boolean (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains ecma-true simple value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_true (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_SIMPLE @@ -160,7 +160,7 @@ ecma_is_value_true (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains ecma-number value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_number (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER); @@ -172,7 +172,7 @@ ecma_is_value_number (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains ecma-string value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_string (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_STRING); @@ -184,7 +184,7 @@ ecma_is_value_string (const ecma_value_t& value) /**< ecma-value */ * @return true - if the value contains object value, * false - otherwise. */ -bool __attribute_pure__ __attribute_always_inline__ +bool __attr_pure___ __attr_always_inline___ ecma_is_value_object (const ecma_value_t& value) /**< ecma-value */ { return (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT); @@ -208,7 +208,7 @@ ecma_check_value_type_is_spec_defined (const ecma_value_t& value) /**< ecma-valu /** * Simple value constructor */ -ecma_value_t __attribute_const__ __attribute_always_inline__ +ecma_value_t __attr_const___ __attr_always_inline___ ecma_make_simple_value (ecma_simple_value_t value) /**< simple value */ { ecma_value_t ret_value = 0; @@ -222,7 +222,7 @@ ecma_make_simple_value (ecma_simple_value_t value) /**< simple value */ /** * Number value constructor */ -ecma_value_t __attribute_const__ +ecma_value_t __attr_const___ ecma_make_number_value (ecma_number_t* num_p) /**< number to reference in value */ { JERRY_ASSERT(num_p != NULL); @@ -241,7 +241,7 @@ ecma_make_number_value (ecma_number_t* num_p) /**< number to reference in value /** * String value constructor */ -ecma_value_t __attribute_const__ +ecma_value_t __attr_const___ ecma_make_string_value (ecma_string_t* ecma_string_p) /**< string to reference in value */ { JERRY_ASSERT(ecma_string_p != NULL); @@ -260,7 +260,7 @@ ecma_make_string_value (ecma_string_t* ecma_string_p) /**< string to reference i /** * object value constructor */ -ecma_value_t __attribute_const__ +ecma_value_t __attr_const___ ecma_make_object_value (ecma_object_t* object_p) /**< object to reference in value */ { JERRY_ASSERT(object_p != NULL); @@ -281,7 +281,7 @@ ecma_make_object_value (ecma_object_t* object_p) /**< object to reference in val * * @return the pointer */ -ecma_number_t* __attribute_pure__ +ecma_number_t* __attr_pure___ ecma_get_number_from_value (const ecma_value_t& value) /**< ecma-value */ { JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER); @@ -295,7 +295,7 @@ ecma_get_number_from_value (const ecma_value_t& value) /**< ecma-value */ * * @return the pointer */ -ecma_string_t* __attribute_pure__ +ecma_string_t* __attr_pure___ ecma_get_string_from_value (const ecma_value_t& value) /**< ecma-value */ { JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_STRING); @@ -309,7 +309,7 @@ ecma_get_string_from_value (const ecma_value_t& value) /**< ecma-value */ * * @return the pointer */ -ecma_object_t* __attribute_pure__ +ecma_object_t* __attr_pure___ ecma_get_object_from_value (const ecma_value_t& value) /**< ecma-value */ { JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT); @@ -439,7 +439,7 @@ ecma_free_value (ecma_value_t& value, /**< value description */ * * @return type field */ -static ecma_completion_type_t __attribute_const__ +static ecma_completion_type_t __attr_const___ ecma_get_completion_value_type_field (ecma_completion_value_t completion_value) /**< completion value */ { return (ecma_completion_type_t) jrt_extract_bit_field (completion_value, @@ -452,7 +452,7 @@ ecma_get_completion_value_type_field (ecma_completion_value_t completion_value) * * @return value field */ -static ecma_value_t __attribute_const__ +static ecma_value_t __attr_const___ ecma_get_completion_value_value_field (ecma_completion_value_t completion_value) /**< completion value */ { return (ecma_value_t) jrt_extract_bit_field (completion_value, @@ -465,7 +465,7 @@ ecma_get_completion_value_value_field (ecma_completion_value_t completion_value) * * @return pointer to label descriptor */ -static ecma_label_descriptor_t* __attribute_const__ +static ecma_label_descriptor_t* __attr_const___ ecma_get_completion_value_label_descriptor (ecma_completion_value_t completion_value) /**< completion value */ { return ECMA_GET_NON_NULL_POINTER (ecma_label_descriptor_t, @@ -479,7 +479,7 @@ ecma_get_completion_value_label_descriptor (ecma_completion_value_t completion_v * * @return completion value with updated field */ -static ecma_completion_value_t __attribute_const__ +static ecma_completion_value_t __attr_const___ ecma_set_completion_value_type_field (ecma_completion_value_t completion_value, /**< completion value * to set field in */ ecma_completion_type_t type_field) /**< new field value */ @@ -495,7 +495,7 @@ ecma_set_completion_value_type_field (ecma_completion_value_t completion_value, * * @return completion value with updated field */ -static ecma_completion_value_t __attribute_pure__ +static ecma_completion_value_t __attr_pure___ ecma_set_completion_value_value_field (ecma_completion_value_t completion_value, /**< completion value * to set field in */ const ecma_value_t& value_field) /**< new field value */ @@ -511,7 +511,7 @@ ecma_set_completion_value_value_field (ecma_completion_value_t completion_value, * * @return completion value with updated field */ -static ecma_completion_value_t __attribute_const__ +static ecma_completion_value_t __attr_const___ ecma_set_completion_value_label_descriptor (ecma_completion_value_t completion_value, /**< completion value * to set field in */ ecma_label_descriptor_t* label_desc_p) /**< pointer to the @@ -531,7 +531,7 @@ ecma_set_completion_value_label_descriptor (ecma_completion_value_t completion_v * * @return completion value */ -ecma_completion_value_t __attribute_pure__ __attribute_always_inline__ +ecma_completion_value_t __attr_pure___ __attr_always_inline___ ecma_make_completion_value (ecma_completion_type_t type, /**< type */ const ecma_value_t& value) /**< value */ { @@ -559,7 +559,7 @@ ecma_make_completion_value (ecma_completion_type_t type, /**< type */ * * @return completion value */ -ecma_completion_value_t __attribute_const__ +ecma_completion_value_t __attr_const___ ecma_make_label_completion_value (ecma_completion_type_t type, /**< type */ uint8_t depth_level, /**< depth level (in try constructions, with blocks, etc.) */ @@ -587,7 +587,7 @@ ecma_make_label_completion_value (ecma_completion_type_t type, /**< type */ * * @return completion value */ -ecma_completion_value_t __attribute_const__ __attribute_always_inline__ +ecma_completion_value_t __attr_const___ __attr_always_inline___ ecma_make_simple_completion_value (ecma_simple_value_t simple_value) /**< simple ecma-value */ { JERRY_ASSERT(simple_value == ECMA_SIMPLE_VALUE_UNDEFINED @@ -604,7 +604,7 @@ ecma_make_simple_completion_value (ecma_simple_value_t simple_value) /**< simple * * @return completion value */ -ecma_completion_value_t __attribute_pure__ __attribute_always_inline__ +ecma_completion_value_t __attr_pure___ __attr_always_inline___ ecma_make_normal_completion_value (const ecma_value_t& value) /**< value */ { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL, value); @@ -615,7 +615,7 @@ ecma_make_normal_completion_value (const ecma_value_t& value) /**< value */ * * @return completion value */ -ecma_completion_value_t __attribute_pure__ __attribute_always_inline__ +ecma_completion_value_t __attr_pure___ __attr_always_inline___ ecma_make_throw_completion_value (const ecma_value_t& value) /**< value */ { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_THROW, value); @@ -626,7 +626,7 @@ ecma_make_throw_completion_value (const ecma_value_t& value) /**< value */ * * @return 'throw' completion value */ -ecma_completion_value_t __attribute_const__ +ecma_completion_value_t __attr_const___ ecma_make_throw_obj_completion_value (ecma_object_t *exception_p) /**< an object */ { JERRY_ASSERT(exception_p != NULL @@ -642,7 +642,7 @@ ecma_make_throw_obj_completion_value (ecma_object_t *exception_p) /**< an object * * @return (normal, empty, reserved) completion value. */ -ecma_completion_value_t __attribute_const__ __attribute_always_inline__ +ecma_completion_value_t __attr_const___ __attr_always_inline___ ecma_make_empty_completion_value (void) { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL, @@ -654,7 +654,7 @@ ecma_make_empty_completion_value (void) * * @return completion value */ -ecma_completion_value_t __attribute_pure__ __attribute_always_inline__ +ecma_completion_value_t __attr_pure___ __attr_always_inline___ ecma_make_return_completion_value (const ecma_value_t& value) /**< value */ { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_RETURN, value); @@ -665,7 +665,7 @@ ecma_make_return_completion_value (const ecma_value_t& value) /**< value */ * * @return completion value */ -ecma_completion_value_t __attribute_const__ __attribute_always_inline__ +ecma_completion_value_t __attr_const___ __attr_always_inline___ ecma_make_exit_completion_value (bool is_successful) /**< does completion value indicate successfulness completion of script execution (true) or not (false) */ @@ -680,7 +680,7 @@ ecma_make_exit_completion_value (bool is_successful) /**< does completion value * * @return completion value */ -ecma_completion_value_t __attribute_const__ __attribute_always_inline__ +ecma_completion_value_t __attr_const___ __attr_always_inline___ ecma_make_meta_completion_value (void) { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_META, @@ -692,7 +692,7 @@ ecma_make_meta_completion_value (void) * * @return ecma-value */ -ecma_value_t __attribute_const__ __attribute_always_inline__ +ecma_value_t __attr_const___ __attr_always_inline___ ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**< completion value */ { const ecma_completion_type_t type = ecma_get_completion_value_type_field (completion_value); @@ -712,7 +712,7 @@ ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**< * * @return pointer */ -ecma_number_t* __attribute_const__ +ecma_number_t* __attr_const___ ecma_get_number_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */ { return ecma_get_number_from_value (ecma_get_completion_value_value (completion_value)); @@ -723,7 +723,7 @@ ecma_get_number_from_completion_value (ecma_completion_value_t completion_value) * * @return pointer */ -ecma_string_t* __attribute_const__ +ecma_string_t* __attr_const___ ecma_get_string_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */ { return ecma_get_string_from_value (ecma_get_completion_value_value (completion_value)); @@ -734,7 +734,7 @@ ecma_get_string_from_completion_value (ecma_completion_value_t completion_value) * * @return pointer */ -ecma_object_t* __attribute_const__ +ecma_object_t* __attr_const___ ecma_get_object_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */ { return ecma_get_object_from_value (ecma_get_completion_value_value (completion_value)); @@ -802,7 +802,7 @@ ecma_free_completion_value (ecma_completion_value_t completion_value) /**< compl * @return true - if the completion type is normal, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_normal (ecma_completion_value_t value) /**< completion value */ { return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_NORMAL); @@ -814,7 +814,7 @@ ecma_is_completion_value_normal (ecma_completion_value_t value) /**< completion * @return true - if the completion type is throw, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_throw (ecma_completion_value_t value) /**< completion value */ { return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_THROW); @@ -826,7 +826,7 @@ ecma_is_completion_value_throw (ecma_completion_value_t value) /**< completion v * @return true - if the completion type is return, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_return (ecma_completion_value_t value) /**< completion value */ { return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_RETURN); @@ -838,7 +838,7 @@ ecma_is_completion_value_return (ecma_completion_value_t value) /**< completion * @return true - if the completion type is exit, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_exit (ecma_completion_value_t value) /**< completion value */ { if (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_EXIT) @@ -859,7 +859,7 @@ ecma_is_completion_value_exit (ecma_completion_value_t value) /**< completion va * @return true - if the completion type is meta, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_meta (ecma_completion_value_t value) /**< completion value */ { if (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_META) @@ -880,7 +880,7 @@ ecma_is_completion_value_meta (ecma_completion_value_t value) /**< completion va * @return true - if the completion type is break, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_break (ecma_completion_value_t value) /**< completion value */ { return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_BREAK); @@ -892,7 +892,7 @@ ecma_is_completion_value_break (ecma_completion_value_t value) /**< completion v * @return true - if the completion type is continue, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_continue (ecma_completion_value_t value) /**< completion value */ { return (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_CONTINUE); @@ -905,7 +905,7 @@ ecma_is_completion_value_continue (ecma_completion_value_t value) /**< completio * value contains specified simple ecma-value, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_normal_simple_value (ecma_completion_value_t value, /**< completion value */ ecma_simple_value_t simple_value) /**< simple value to check for equality with */ @@ -920,7 +920,7 @@ ecma_is_completion_value_normal_simple_value (ecma_completion_value_t value, /** * value contains ecma-true simple value, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_normal_true (ecma_completion_value_t value) /**< completion value */ { return ecma_is_completion_value_normal_simple_value (value, ECMA_SIMPLE_VALUE_TRUE); @@ -933,7 +933,7 @@ ecma_is_completion_value_normal_true (ecma_completion_value_t value) /**< comple * value contains ecma-false simple value, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_normal_false (ecma_completion_value_t value) /**< completion value */ { return ecma_is_completion_value_normal_simple_value (value, ECMA_SIMPLE_VALUE_FALSE); @@ -946,7 +946,7 @@ ecma_is_completion_value_normal_false (ecma_completion_value_t value) /**< compl * value contains empty simple value, * false - otherwise. */ -bool __attribute_const__ __attribute_always_inline__ +bool __attr_const___ __attr_always_inline___ ecma_is_completion_value_empty (ecma_completion_value_t value) /**< completion value */ { return (ecma_is_completion_value_normal (value) diff --git a/src/ecma/base/ecma-helpers.cpp b/src/ecma/base/ecma-helpers.cpp index 27a2282ee..07053d61f 100644 --- a/src/ecma/base/ecma-helpers.cpp +++ b/src/ecma/base/ecma-helpers.cpp @@ -186,7 +186,7 @@ ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, /**< out /** * Check if the object is lexical environment. */ -bool __attribute_pure__ +bool __attr_pure___ ecma_is_lexical_environment (const ecma_object_t *object_p) /**< object or lexical environment */ { JERRY_ASSERT (object_p != NULL); @@ -199,7 +199,7 @@ ecma_is_lexical_environment (const ecma_object_t *object_p) /**< object or lexic /** * Get value of [[Extensible]] object's internal property. */ -bool __attribute_pure__ +bool __attr_pure___ ecma_get_object_extensible (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); @@ -229,7 +229,7 @@ ecma_set_object_extensible (ecma_object_t *object_p, /**< object */ /** * Get object's internal implementation-defined type. */ -ecma_object_type_t __attribute_pure__ +ecma_object_type_t __attr_pure___ ecma_get_object_type (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); @@ -259,7 +259,7 @@ ecma_set_object_type (ecma_object_t *object_p, /**< object */ /** * Get object's prototype. */ -ecma_object_t* __attribute_pure__ +ecma_object_t* __attr_pure___ ecma_get_object_prototype (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); @@ -278,7 +278,7 @@ ecma_get_object_prototype (const ecma_object_t *object_p) /**< object */ * * @return true / false */ -bool __attribute_pure__ +bool __attr_pure___ ecma_get_object_is_builtin (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); @@ -318,7 +318,7 @@ ecma_set_object_is_builtin (ecma_object_t *object_p, /**< object */ /** * Get type of lexical environment. */ -ecma_lexical_environment_type_t __attribute_pure__ +ecma_lexical_environment_type_t __attr_pure___ ecma_get_lex_env_type (const ecma_object_t *object_p) /**< lexical environment */ { JERRY_ASSERT (object_p != NULL); @@ -332,7 +332,7 @@ ecma_get_lex_env_type (const ecma_object_t *object_p) /**< lexical environment * /** * Get outer reference of lexical environment. */ -ecma_object_t* __attribute_pure__ +ecma_object_t* __attr_pure___ ecma_get_lex_env_outer_reference (const ecma_object_t *object_p) /**< lexical environment */ { JERRY_ASSERT (object_p != NULL); @@ -349,7 +349,7 @@ ecma_get_lex_env_outer_reference (const ecma_object_t *object_p) /**< lexical en /** * Get object's/lexical environment's property list. */ -ecma_property_t* __attribute_pure__ +ecma_property_t* __attr_pure___ ecma_get_property_list (const ecma_object_t *object_p) /**< object or lexical environment */ { JERRY_ASSERT (object_p != NULL); @@ -387,7 +387,7 @@ ecma_set_property_list (ecma_object_t *object_p, /**< object or lexical environm /** * Get lexical environment's 'provideThis' property */ -bool __attribute_pure__ +bool __attr_pure___ ecma_get_lex_env_provide_this (const ecma_object_t *object_p) /**< object-bound lexical environment */ { JERRY_ASSERT (object_p != NULL); @@ -405,7 +405,7 @@ ecma_get_lex_env_provide_this (const ecma_object_t *object_p) /**< object-bound /** * Get lexical environment's bound object. */ -ecma_object_t* __attribute_pure__ +ecma_object_t* __attr_pure___ ecma_get_lex_env_binding_object (const ecma_object_t *object_p) /**< object-bound lexical environment */ { JERRY_ASSERT (object_p != NULL); diff --git a/src/ecma/base/ecma-helpers.h b/src/ecma/base/ecma-helpers.h index d80ff291a..5670c57be 100644 --- a/src/ecma/base/ecma-helpers.h +++ b/src/ecma/base/ecma-helpers.h @@ -77,9 +77,9 @@ extern ecma_value_t ecma_make_simple_value (ecma_simple_value_t value); extern ecma_value_t ecma_make_number_value (ecma_number_t* num_p); extern ecma_value_t ecma_make_string_value (ecma_string_t* ecma_string_p); extern ecma_value_t ecma_make_object_value (ecma_object_t* object_p); -extern ecma_number_t* __attribute_pure__ ecma_get_number_from_value (const ecma_value_t& value); -extern ecma_string_t* __attribute_pure__ ecma_get_string_from_value (const ecma_value_t& value); -extern ecma_object_t* __attribute_pure__ ecma_get_object_from_value (const ecma_value_t& value); +extern ecma_number_t* __attr_pure___ ecma_get_number_from_value (const ecma_value_t& value); +extern ecma_string_t* __attr_pure___ ecma_get_string_from_value (const ecma_value_t& value); +extern ecma_object_t* __attr_pure___ ecma_get_object_from_value (const ecma_value_t& value); extern ecma_value_t ecma_copy_value (const ecma_value_t& value, bool do_ref_if_object); extern void ecma_free_value (ecma_value_t& value, bool do_deref_if_object); @@ -97,11 +97,11 @@ extern ecma_completion_value_t ecma_make_return_completion_value (const ecma_val extern ecma_completion_value_t ecma_make_exit_completion_value (bool is_successful); extern ecma_completion_value_t ecma_make_meta_completion_value (void); extern ecma_value_t ecma_get_completion_value_value (ecma_completion_value_t completion_value); -extern ecma_number_t* __attribute_const__ +extern ecma_number_t* __attr_const___ ecma_get_number_from_completion_value (ecma_completion_value_t completion_value); -extern ecma_string_t* __attribute_const__ +extern ecma_string_t* __attr_const___ ecma_get_string_from_completion_value (ecma_completion_value_t completion_value); -extern ecma_object_t* __attribute_const__ +extern ecma_object_t* __attr_const___ ecma_get_object_from_completion_value (ecma_completion_value_t completion_value); extern ecma_completion_value_t ecma_copy_completion_value (ecma_completion_value_t value); extern void ecma_free_completion_value (ecma_completion_value_t completion_value); @@ -230,20 +230,20 @@ extern ecma_object_t* ecma_create_decl_lex_env (ecma_object_t *outer_lexical_env extern ecma_object_t* ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, ecma_object_t *binding_obj_p, bool provide_this); -extern bool __attribute_pure__ ecma_is_lexical_environment (const ecma_object_t *object_p); -extern bool __attribute_pure__ ecma_get_object_extensible (const ecma_object_t *object_p); +extern bool __attr_pure___ ecma_is_lexical_environment (const ecma_object_t *object_p); +extern bool __attr_pure___ ecma_get_object_extensible (const ecma_object_t *object_p); extern void ecma_set_object_extensible (ecma_object_t *object_p, bool is_extensible); -extern ecma_object_type_t __attribute_pure__ ecma_get_object_type (const ecma_object_t *object_p); +extern ecma_object_type_t __attr_pure___ ecma_get_object_type (const ecma_object_t *object_p); extern void ecma_set_object_type (ecma_object_t *object_p, ecma_object_type_t type); -extern ecma_object_t* __attribute_pure__ ecma_get_object_prototype (const ecma_object_t *object_p); -extern bool __attribute_pure__ ecma_get_object_is_builtin (const ecma_object_t *object_p); +extern ecma_object_t* __attr_pure___ ecma_get_object_prototype (const ecma_object_t *object_p); +extern bool __attr_pure___ ecma_get_object_is_builtin (const ecma_object_t *object_p); extern void ecma_set_object_is_builtin (ecma_object_t *object_p, bool is_builtin); -extern ecma_lexical_environment_type_t __attribute_pure__ ecma_get_lex_env_type (const ecma_object_t *object_p); -extern ecma_object_t* __attribute_pure__ ecma_get_lex_env_outer_reference (const ecma_object_t *object_p); -extern ecma_property_t* __attribute_pure__ ecma_get_property_list (const ecma_object_t *object_p); -extern ecma_object_t* __attribute_pure__ ecma_get_lex_env_binding_object (const ecma_object_t *object_p); -extern bool __attribute_pure__ ecma_get_lex_env_provide_this (const ecma_object_t *object_p); +extern ecma_lexical_environment_type_t __attr_pure___ ecma_get_lex_env_type (const ecma_object_t *object_p); +extern ecma_object_t* __attr_pure___ ecma_get_lex_env_outer_reference (const ecma_object_t *object_p); +extern ecma_property_t* __attr_pure___ ecma_get_property_list (const ecma_object_t *object_p); +extern ecma_object_t* __attr_pure___ ecma_get_lex_env_binding_object (const ecma_object_t *object_p); +extern bool __attr_pure___ ecma_get_lex_env_provide_this (const ecma_object_t *object_p); extern ecma_property_t* ecma_create_internal_property (ecma_object_t *object_p, ecma_internal_property_id_t property_id); diff --git a/src/ecma/base/ecma-lcache.cpp b/src/ecma/base/ecma-lcache.cpp index 56698d96f..7ec069e81 100644 --- a/src/ecma/base/ecma-lcache.cpp +++ b/src/ecma/base/ecma-lcache.cpp @@ -17,7 +17,7 @@ #include "ecma-globals.h" #include "ecma-helpers.h" #include "ecma-lcache.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" /** \addtogroup ecma ECMA * @{ @@ -218,7 +218,7 @@ ecma_lcache_insert (ecma_object_t *object_p, /**< object */ * @return true - if (object, property name) pair is registered in LCache, * false - probably, not registered. */ -bool __attribute_always_inline__ +bool __attr_always_inline___ ecma_lcache_lookup (ecma_object_t *object_p, /**< object */ const ecma_string_t *prop_name_p, /**< property's name */ ecma_property_t **prop_p_p) /**< out: if return value is true, diff --git a/src/ecma/base/ecma-stack.cpp b/src/ecma/base/ecma-stack.cpp index 891523a44..6371ebf6d 100644 --- a/src/ecma/base/ecma-stack.cpp +++ b/src/ecma/base/ecma-stack.cpp @@ -160,7 +160,7 @@ ecma_stack_slots_in_top_chunk (ecma_stack_frame_t *frame_p) /**< ecma-stack fram /** * Longpath for ecma_stack_push_value (for case current chunk may be doesn't have free slots) */ -static void __noinline +static void __attr_noinline___ ecma_stack_push_value_longpath (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ { JERRY_ASSERT (frame_p->current_slot_index >= JERRY_MIN (ECMA_STACK_FRAME_INLINED_VALUES_NUMBER, @@ -205,7 +205,7 @@ ecma_stack_push_value (ecma_stack_frame_t *frame_p, /**< ecma-stack frame */ /** * Get top value from ecma-stack */ -ecma_value_t __attribute_always_inline__ +ecma_value_t __attr_always_inline___ ecma_stack_top_value (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ { const size_t slots_in_top_chunk = ecma_stack_slots_in_top_chunk (frame_p); @@ -218,7 +218,7 @@ ecma_stack_top_value (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ /** * Longpath for ecma_stack_pop (for case a dynamically allocated chunk needs to be deallocated) */ -static void __noinline +static void __attr_noinline___ ecma_stack_pop_longpath (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ { JERRY_ASSERT (frame_p->current_slot_index == 0 && frame_p->top_chunk_p != NULL); diff --git a/src/ecma/builtin-objects/ecma-builtin-array.cpp b/src/ecma/builtin-objects/ecma-builtin-array.cpp index 7ddbddfa5..064f3437a 100644 --- a/src/ecma/builtin-objects/ecma-builtin-array.cpp +++ b/src/ecma/builtin-objects/ecma-builtin-array.cpp @@ -54,7 +54,7 @@ * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_array_object_is_array (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_array_object_is_array (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< first argument */ { ecma_simple_value_t is_array = ECMA_SIMPLE_VALUE_FALSE; diff --git a/src/ecma/builtin-objects/ecma-builtin-global.cpp b/src/ecma/builtin-objects/ecma-builtin-global.cpp index 13a70e59d..ba8a2053b 100644 --- a/src/ecma/builtin-objects/ecma-builtin-global.cpp +++ b/src/ecma/builtin-objects/ecma-builtin-global.cpp @@ -98,7 +98,7 @@ ecma_builtin_global_object_parse_float (const ecma_value_t& this_arg, /**< this * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_global_object_is_nan (const ecma_value_t& this_arg __unused, /**< this argument */ +ecma_builtin_global_object_is_nan (const ecma_value_t& this_arg __attr_unused___, /**< this argument */ const ecma_value_t& arg) /**< routine's first argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -125,7 +125,7 @@ ecma_builtin_global_object_is_nan (const ecma_value_t& this_arg __unused, /**< t * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_global_object_is_finite (const ecma_value_t& this_arg __unused, /**< this argument */ +ecma_builtin_global_object_is_finite (const ecma_value_t& this_arg __attr_unused___, /**< this argument */ const ecma_value_t& arg) /**< routine's first argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); diff --git a/src/ecma/builtin-objects/ecma-builtin-math.cpp b/src/ecma/builtin-objects/ecma-builtin-math.cpp index ab3b0aed9..28a7c5b2b 100644 --- a/src/ecma/builtin-objects/ecma-builtin-math.cpp +++ b/src/ecma/builtin-objects/ecma-builtin-math.cpp @@ -55,7 +55,7 @@ * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_abs (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_abs (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -171,7 +171,7 @@ ecma_builtin_math_object_ceil (const ecma_value_t& this_arg, /**< 'this' argumen * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_cos (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_cos (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -239,7 +239,7 @@ ecma_builtin_math_object_cos (const ecma_value_t& this_arg __unused, /**< 'this' * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_exp (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_exp (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -305,7 +305,7 @@ ecma_builtin_math_object_floor (const ecma_value_t& this_arg, /**< 'this' argume * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_log (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_log (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -352,7 +352,7 @@ ecma_builtin_math_object_log (const ecma_value_t& this_arg __unused, /**< 'this' * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_max (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_max (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t args[], /**< arguments list */ ecma_length_t args_number) /**< number of arguments */ { @@ -439,7 +439,7 @@ ecma_builtin_math_object_max (const ecma_value_t& this_arg __unused, /**< 'this' * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_min (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_min (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t args[], /**< arguments list */ ecma_length_t args_number) /**< number of arguments */ { @@ -526,7 +526,7 @@ ecma_builtin_math_object_min (const ecma_value_t& this_arg __unused, /**< 'this' * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_pow (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_pow (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg1, /**< first routine's argument */ const ecma_value_t& arg2) /**< second routine's argument */ { @@ -760,7 +760,7 @@ ecma_builtin_math_object_pow (const ecma_value_t& this_arg __unused, /**< 'this' * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_random (const ecma_value_t& this_arg __unused) /**< 'this' argument */ +ecma_builtin_math_object_random (const ecma_value_t& this_arg __attr_unused___) /**< 'this' argument */ { /* Implementation of George Marsaglia's XorShift random number generator */ TODO (/* Check for license issues */); @@ -801,7 +801,7 @@ ecma_builtin_math_object_random (const ecma_value_t& this_arg __unused) /**< 'th * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_round (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_round (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -855,7 +855,7 @@ ecma_builtin_math_object_round (const ecma_value_t& this_arg __unused, /**< 'thi * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_sin (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_sin (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); @@ -923,7 +923,7 @@ ecma_builtin_math_object_sin (const ecma_value_t& this_arg __unused, /**< 'this' * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_math_object_sqrt (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_math_object_sqrt (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg) /**< routine's argument */ { ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); diff --git a/src/ecma/builtin-objects/ecma-builtin-object.cpp b/src/ecma/builtin-objects/ecma-builtin-object.cpp index 5a6b3ffb5..9b717e91b 100644 --- a/src/ecma/builtin-objects/ecma-builtin-object.cpp +++ b/src/ecma/builtin-objects/ecma-builtin-object.cpp @@ -306,7 +306,7 @@ ecma_builtin_object_object_define_properties (const ecma_value_t& this_arg, /**< * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_object_object_define_property (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_object_object_define_property (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t& arg1, /**< routine's first argument */ const ecma_value_t& arg2, /**< routine's second argument */ const ecma_value_t& arg3) /**< routine's third argument */ diff --git a/src/ecma/builtin-objects/ecma-builtin-string.cpp b/src/ecma/builtin-objects/ecma-builtin-string.cpp index 1b7d9944a..4e77d7d5b 100644 --- a/src/ecma/builtin-objects/ecma-builtin-string.cpp +++ b/src/ecma/builtin-objects/ecma-builtin-string.cpp @@ -54,7 +54,7 @@ * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_string_object_from_char_code (const ecma_value_t& this_arg __unused, /**< 'this' argument */ +ecma_builtin_string_object_from_char_code (const ecma_value_t& this_arg __attr_unused___, /**< 'this' argument */ const ecma_value_t args[], /**< arguments list */ ecma_length_t args_number) /**< number of arguments */ { diff --git a/src/ecma/operations/ecma-conversion.cpp b/src/ecma/operations/ecma-conversion.cpp index b2a327930..ceedc7f32 100644 --- a/src/ecma/operations/ecma-conversion.cpp +++ b/src/ecma/operations/ecma-conversion.cpp @@ -30,7 +30,7 @@ #include "ecma-objects-general.h" #include "ecma-string-object.h" #include "ecma-try-catch-macro.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/ecma/operations/ecma-function-object.cpp b/src/ecma/operations/ecma-function-object.cpp index 765ce41fd..9508414c8 100644 --- a/src/ecma/operations/ecma-function-object.cpp +++ b/src/ecma/operations/ecma-function-object.cpp @@ -44,7 +44,7 @@ ecma_pack_code_internal_property_value (bool is_strict, /**< is code strict? */ opcode_counter_t opcode_idx) /**< index of first opcode */ { uint32_t value = opcode_idx; - const uint32_t is_strict_bit_offset = sizeof (value) * JERRY_BITSINBYTE - 1; + const uint32_t is_strict_bit_offset = (uint32_t) (sizeof (value) * JERRY_BITSINBYTE - 1); JERRY_ASSERT(((value) & (1u << is_strict_bit_offset)) == 0); @@ -68,7 +68,7 @@ ecma_unpack_code_internal_property_value (uint32_t value, /**< packed value */ { JERRY_ASSERT(out_is_strict_p != NULL); - const uint32_t is_strict_bit_offset = sizeof (value) * JERRY_BITSINBYTE - 1; + const uint32_t is_strict_bit_offset = (uint32_t) (sizeof (value) * JERRY_BITSINBYTE - 1); bool is_strict = ((value & (1u << is_strict_bit_offset)) != 0); *out_is_strict_p = is_strict; diff --git a/src/ecma/operations/ecma-objects.cpp b/src/ecma/operations/ecma-objects.cpp index 9299b2e7c..852694229 100644 --- a/src/ecma/operations/ecma-objects.cpp +++ b/src/ecma/operations/ecma-objects.cpp @@ -83,7 +83,7 @@ ecma_op_object_get (ecma_object_t *obj_p, /**< the object */ * @return pointer to a property - if it exists, * NULL (i.e. ecma-undefined) - otherwise. */ -static __noinline ecma_property_t* +static __attr_noinline___ ecma_property_t* ecma_op_object_get_own_property_longpath (ecma_object_t *obj_p, /**< the object */ ecma_string_t *property_name_p) /**< property name */ { diff --git a/src/ecma/operations/ecma-try-catch-macro.h b/src/ecma/operations/ecma-try-catch-macro.h index 620119726..426d85001 100644 --- a/src/ecma/operations/ecma-try-catch-macro.h +++ b/src/ecma/operations/ecma-try-catch-macro.h @@ -39,7 +39,7 @@ { \ JERRY_ASSERT(ecma_is_completion_value_normal (var ## _completion)); \ \ - ecma_value_t var __unused = ecma_get_completion_value_value (var ## _completion) + ecma_value_t var __attr_unused___ = ecma_get_completion_value_value (var ## _completion) /** * The macro marks end of code block that is defined by corresponding diff --git a/src/jerry.h b/src/jerry.h index 5d81b1455..e4e612e7e 100644 --- a/src/jerry.h +++ b/src/jerry.h @@ -16,7 +16,8 @@ #ifndef JERRY_H #define JERRY_H -#include "jrt_types.h" +#include +#include /** \addtogroup jerry Jerry engine interface * @{ diff --git a/src/jrt/jrt-bit-fields.cpp b/src/jrt/jrt-bit-fields.cpp index 37bb678d4..991d30f25 100644 --- a/src/jrt/jrt-bit-fields.cpp +++ b/src/jrt/jrt-bit-fields.cpp @@ -21,7 +21,7 @@ * * @return bit-field's value */ -uint64_t __attribute_const__ +uint64_t __attr_const___ jrt_extract_bit_field (uint64_t container, /**< container to extract bit-field from */ uint32_t lsb, /**< least significant bit of the value * to be extracted */ @@ -42,7 +42,7 @@ jrt_extract_bit_field (uint64_t container, /**< container to extract bit-field f * * @return bit-field's value */ -uint64_t __attribute_const__ +uint64_t __attr_const___ jrt_set_bit_field_value (uint64_t container, /**< container to insert bit-field to */ uint64_t new_bit_field_value, /**< value of bit-field to insert */ uint32_t lsb, /**< least significant bit of the value diff --git a/src/jrt/jrt-bit-fields.h b/src/jrt/jrt-bit-fields.h index 1a8925a4c..88d8f2043 100644 --- a/src/jrt/jrt-bit-fields.h +++ b/src/jrt/jrt-bit-fields.h @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,9 @@ #ifndef JERRY_BIT_FIELDS_H #define JERRY_BIT_FIELDS_H -extern uint64_t __attribute_const__ jrt_extract_bit_field (uint64_t value, uint32_t lsb, +extern uint64_t __attr_const___ jrt_extract_bit_field (uint64_t value, uint32_t lsb, uint32_t width); -extern uint64_t __attribute_const__ jrt_set_bit_field_value (uint64_t value, uint64_t bit_field_value, +extern uint64_t __attr_const___ jrt_set_bit_field_value (uint64_t value, uint64_t bit_field_value, uint32_t lsb, uint32_t width); #endif /* !JERRY_BIT_FIELDS_H */ diff --git a/src/jrt/jrt-fatals.cpp b/src/jrt/jrt-fatals.cpp index c39f386e1..4e9ba628e 100644 --- a/src/jrt/jrt-fatals.cpp +++ b/src/jrt/jrt-fatals.cpp @@ -18,7 +18,7 @@ */ #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" /* * Exit with specified status code. @@ -75,8 +75,8 @@ jerry_assert_fail (const char *assertion, /**< assertion condition string */ const uint32_t line) /** line */ { #ifndef JERRY_NDEBUG - printf ("ICE: Assertion '%s' failed at %s(%s):%u.\n", - assertion, file, function, line); + printf ("ICE: Assertion '%s' failed at %s(%s):%lu.\n", + assertion, file, function, (unsigned long) line); #else /* !JERRY_NDEBUG */ (void) assertion; (void) file; @@ -98,7 +98,7 @@ jerry_unreachable (const char *comment, /**< comment to unreachable mark if exis const uint32_t line) /**< line */ { #ifndef JERRY_NDEBUG - printf ("ICE: Unreachable control path at %s(%s):%u was executed", file, function, line); + printf ("ICE: Unreachable control path at %s(%s):%lu was executed", file, function, (unsigned long) line); #else /* !JERRY_NDEBUG */ (void) file; (void) function; @@ -125,7 +125,7 @@ jerry_unimplemented (const char *comment, /**< comment to unimplemented mark if const uint32_t line) /**< line */ { #ifndef JERRY_NDEBUG - printf ("SORRY: Unimplemented case at %s(%s):%u was executed", file, function, line); + printf ("SORRY: Unimplemented case at %s(%s):%lu was executed", file, function, (unsigned long) line); #else /* !JERRY_NDEBUG */ (void) file; (void) function; diff --git a/src/jrt/jrt-libc-includes.h b/src/jrt/jrt-libc-includes.h new file mode 100644 index 000000000..b0e2aef7e --- /dev/null +++ b/src/jrt/jrt-libc-includes.h @@ -0,0 +1,53 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JRT_LIBC_INCLUDES_H +#define JRT_LIBC_INCLUDES_H + +#include +#include +#include +#include + +/* Ensuring no macro implementation of functions declared in the headers are used */ +#undef isspace +#undef isalpha +#undef islower +#undef isupper +#undef isdigit +#undef isxdigit +#undef memset +#undef memcmp +#undef memcpy +#undef memmove +#undef strcmp +#undef strncmp +#undef strncpy +#undef strlen +#undef putchar +#undef puts +#undef exit +#undef fopen +#undef rewind +#undef fclose +#undef fseek +#undef ftell +#undef fread +#undef fwrite +#undef vfprintf +#undef fprintf +#undef printf + +#endif /* !JRT_LIBC_INCLUDES_H */ diff --git a/src/jrt/jrt.h b/src/jrt/jrt.h index a1ba5a7cd..d639c74d1 100644 --- a/src/jrt/jrt.h +++ b/src/jrt/jrt.h @@ -22,33 +22,27 @@ /** * Attributes */ -#define __unused __attribute__((unused)) -#define __used __attribute__((used)) -#define __packed __attribute__((packed)) +#define __attr_unused___ __attribute__((unused)) +#define __attr_used___ __attribute__((used)) +#define __attr_packed___ __attribute__((packed)) #define __noreturn __attribute__((noreturn)) -#define __noinline __attribute__((noinline)) -#define __used __attribute__((used)) -#ifndef __attribute_always_inline__ -# define __attribute_always_inline__ __attribute__((always_inline)) -#endif /* !__attribute_always_inline__ */ -#ifndef __attribute_const__ -# define __attribute_const__ __attribute__((const)) -#endif /* !__attribute_const__ */ -#ifndef __attribute_pure__ -# define __attribute_pure__ __attribute__((pure)) -#endif /* !__attribute_pure__ */ +#define __attr_noinline___ __attribute__((noinline)) +#define __attr_used___ __attribute__((used)) +#ifndef __attr_always_inline___ +# define __attr_always_inline___ __attribute__((always_inline)) +#endif /* !__attr_always_inline___ */ +#ifndef __attr_const___ +# define __attr_const___ __attribute__((const)) +#endif /* !__attr_const___ */ +#ifndef __attr_pure___ +# define __attr_pure___ __attribute__((pure)) +#endif /* !__attr_pure___ */ /** * Constants */ #define JERRY_BITSINBYTE 8 -/** - * Standalone Jerry exit codes - */ -#define JERRY_STANDALONE_EXIT_CODE_OK (0) -#define JERRY_STANDALONE_EXIT_CODE_FAIL (1) - /** * Asserts * @@ -61,7 +55,7 @@ #define JERRY_STATIC_ASSERT_GLUE(a, b) JERRY_STATIC_ASSERT_GLUE_ (a, b) #define JERRY_STATIC_ASSERT(x) \ typedef char JERRY_STATIC_ASSERT_GLUE (static_assertion_failed_, __LINE__) \ - [ (x) ? 1 : -1 ] __unused + [ (x) ? 1 : -1 ] __attr_unused___ #define CALL_PRAGMA(x) _Pragma (#x) diff --git a/src/jrt/jrt_types.h b/src/jrt/jrt_types.h index 9b612cd4f..8d434b966 100644 --- a/src/jrt/jrt_types.h +++ b/src/jrt/jrt_types.h @@ -17,9 +17,9 @@ #define JRT_TYPES_H #include -#include #include #include +#include #include #endif /* !JRT_TYPES_H */ diff --git a/src/main_linux.cpp b/src/main_linux.cpp index 5689e40ee..fe9de5d43 100644 --- a/src/main_linux.cpp +++ b/src/main_linux.cpp @@ -13,38 +13,49 @@ * limitations under the License. */ +#include +#include + #include "jerry.h" -#include "jerry-libc.h" /** * Maximum command line arguments number */ #define JERRY_MAX_COMMAND_LINE_ARGS (64) +/** + * Maximum size of source code buffer + */ +#define JERRY_SOURCE_BUFFER_SIZE (1048576) + +/** + * Standalone Jerry exit codes + */ +#define JERRY_STANDALONE_EXIT_CODE_OK (0) +#define JERRY_STANDALONE_EXIT_CODE_FAIL (1) + static uint8_t source_buffer[ JERRY_SOURCE_BUFFER_SIZE ]; static const char* read_sources (const char *script_file_names[], - size_t files_count, + int files_count, size_t *out_source_size_p) { - JERRY_ASSERT (files_count > 0); - - size_t i; + int i; uint8_t *source_buffer_tail = source_buffer; for (i = 0; i < files_count; i++) { const char *script_file_name = script_file_names[i]; - _FILE *file = fopen (script_file_name, "r"); + FILE *file = fopen (script_file_name, "r"); if (file == NULL) { break; } - int fseek_status = fseek (file, 0, __SEEK_END); + int fseek_status = fseek (file, 0, SEEK_END); if (fseek_status != 0) { @@ -87,7 +98,6 @@ read_sources (const char *script_file_names[], else { const size_t source_size = (size_t) (source_buffer_tail - source_buffer); - JERRY_ASSERT(source_size < sizeof (source_buffer)); *out_source_size_p = source_size; @@ -96,8 +106,8 @@ read_sources (const char *script_file_names[], } int -main (int argc __unused, - char **argv __unused) +main (int argc, + char **argv) { if (argc >= JERRY_MAX_COMMAND_LINE_ARGS) { @@ -108,12 +118,13 @@ main (int argc __unused, const char *file_names[JERRY_MAX_COMMAND_LINE_ARGS]; int i; - size_t files_counter = 0; + int files_counter = 0; size_t max_data_bss_size, max_stack_size; jerry_get_memory_limits (&max_data_bss_size, &max_stack_size); - jrt_set_mem_limits (max_data_bss_size, max_stack_size); + // FIXME: + // jrt_set_mem_limits (max_data_bss_size, max_stack_size); jerry_flag_t flags = JERRY_FLAG_EMPTY; diff --git a/src/main_mcu.cpp b/src/main_mcu.cpp index 7971a5f0d..a1478681e 100644 --- a/src/main_mcu.cpp +++ b/src/main_mcu.cpp @@ -15,35 +15,23 @@ #include "jerry.h" -#include "common-io.h" -#include "actuators.h" -#include "sensors.h" +/** + * Standalone Jerry exit codes + */ +#define JERRY_STANDALONE_EXIT_CODE_OK (0) +#define JERRY_STANDALONE_EXIT_CODE_FAIL (1) #include JERRY_MCU_SCRIPT_HEADER static const char generated_source [] = JERRY_MCU_SCRIPT; -static uint32_t start __unused; -static uint32_t finish_native_ms __unused; -static uint32_t finish_parse_ms __unused; -static uint32_t finish_int_ms __unused; - int main (void) { - initialize_sys_tick (); - initialize_leds (); - initialize_timer (); - const char *source_p = generated_source; const size_t source_size = sizeof (generated_source); - set_sys_tick_counter ((uint32_t) - 1); - start = get_sys_tick_counter (); - jerry_completion_code_t ret_code = jerry_run_simple (source_p, source_size, JERRY_FLAG_EMPTY); - finish_parse_ms = (start - get_sys_tick_counter ()) / 1000; - if (ret_code == JERRY_COMPLETION_CODE_OK) { return JERRY_STANDALONE_EXIT_CODE_OK; diff --git a/src/mem/mem-allocator.cpp b/src/mem/mem-allocator.cpp index 9d733a7df..27079e98a 100644 --- a/src/mem/mem-allocator.cpp +++ b/src/mem/mem-allocator.cpp @@ -18,7 +18,7 @@ */ #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "mem-allocator.h" #include "mem-heap.h" #include "mem-poolman.h" diff --git a/src/mem/mem-heap.cpp b/src/mem/mem-heap.cpp index d2c9ea1fb..9c9755fec 100644 --- a/src/mem/mem-heap.cpp +++ b/src/mem/mem-heap.cpp @@ -25,7 +25,7 @@ */ #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "mem-allocator.h" #include "mem-config.h" #include "mem-heap.h" @@ -858,7 +858,7 @@ mem_heap_free_block (void *ptr) /**< pointer to beginning of data space of the b * * @return recommended allocation size */ -size_t __attribute_pure__ +size_t __attr_pure___ mem_heap_recommend_allocation_size (size_t minimum_allocation_size) /**< minimum allocation size */ { size_t minimum_allocation_size_with_block_header = minimum_allocation_size + sizeof (mem_block_header_t); @@ -885,7 +885,7 @@ mem_heap_print (bool dump_block_headers, /**< print block headers */ { printf ("Heap: start=%p size=%lu, first block->%p, last block->%p\n", mem_heap.heap_start, - mem_heap.heap_size, + (unsigned long) mem_heap.heap_size, (void*) mem_heap.first_block_p, (void*) mem_heap.last_block_p); @@ -898,7 +898,7 @@ mem_heap_print (bool dump_block_headers, /**< print block headers */ printf ("Block (%p): magic num=0x%08x, size in chunks=%lu, previous block->%p next block->%p\n", (void*) block_p, block_p->magic_num, - mem_get_block_chunks_count (block_p), + (unsigned long) mem_get_block_chunks_count (block_p), (void*) mem_get_next_block_by_direction (block_p, MEM_DIRECTION_PREV), (void*) mem_get_next_block_by_direction (block_p, MEM_DIRECTION_NEXT)); @@ -936,7 +936,7 @@ mem_heap_print (bool dump_block_headers, /**< print block headers */ " Peak allocated= %lu bytes\n" " Peak waste = %lu bytes\n", mem_heap_stats.size, - MEM_HEAP_CHUNK_SIZE, + (uint64_t) MEM_HEAP_CHUNK_SIZE, mem_heap_stats.blocks, mem_heap_stats.allocated_blocks, mem_heap_stats.allocated_chunks, diff --git a/src/mem/mem-heap.h b/src/mem/mem-heap.h index 37f398401..6dfdcab05 100644 --- a/src/mem/mem-heap.h +++ b/src/mem/mem-heap.h @@ -44,7 +44,7 @@ extern void mem_heap_finalize (void); extern void* mem_heap_alloc_block (size_t size_in_bytes, mem_heap_alloc_term_t alloc_term); extern bool mem_heap_try_resize_block (void *ptr, size_t size_in_bytes); extern void mem_heap_free_block (void *ptr); -extern size_t __attribute_pure__ mem_heap_recommend_allocation_size (size_t minimum_allocation_size); +extern size_t __attr_pure___ mem_heap_recommend_allocation_size (size_t minimum_allocation_size); extern void mem_heap_print (bool dump_block_headers, bool dump_block_data, bool dump_stats); #ifdef MEM_STATS diff --git a/src/mem/mem-pool.cpp b/src/mem/mem-pool.cpp index f0f804723..019e2121f 100644 --- a/src/mem/mem-pool.cpp +++ b/src/mem/mem-pool.cpp @@ -27,7 +27,7 @@ #define JERRY_MEM_POOL_INTERNAL #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "mem-allocator.h" #include "mem-pool.h" @@ -59,7 +59,7 @@ static void mem_check_pool (mem_pool_state_t *pool_p); * * @return true / false */ -bool __attribute_const__ +bool __attr_const___ mem_pool_is_chunk_inside (mem_pool_state_t *pool_p, /**< pool */ uint8_t *chunk_p) /**< chunk */ { @@ -181,7 +181,7 @@ mem_pool_free_chunk (mem_pool_state_t *pool_p, /**< pool */ * Check pool state consistency */ static void -mem_check_pool (mem_pool_state_t __unused *pool_p) /**< pool (unused #ifdef JERRY_NDEBUG) */ +mem_check_pool (mem_pool_state_t __attr_unused___ *pool_p) /**< pool (unused #ifdef JERRY_NDEBUG) */ { #ifndef JERRY_NDEBUG JERRY_ASSERT(pool_p->free_chunks_number <= MEM_POOL_CHUNKS_NUMBER); diff --git a/src/mem/mem-pool.h b/src/mem/mem-pool.h index 9a33a8b60..c7e171e3c 100644 --- a/src/mem/mem-pool.h +++ b/src/mem/mem-pool.h @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,7 +71,7 @@ typedef struct __attribute__ ((aligned (MEM_ALIGNMENT))) mem_pool_state_t extern void mem_pool_init (mem_pool_state_t *pool_p, size_t pool_size); extern uint8_t* mem_pool_alloc_chunk (mem_pool_state_t *pool_p); extern void mem_pool_free_chunk (mem_pool_state_t *pool_p, uint8_t *chunk_p); -extern bool __attribute_const__ mem_pool_is_chunk_inside (mem_pool_state_t *pool_p, uint8_t *chunk_p); +extern bool __attr_const___ mem_pool_is_chunk_inside (mem_pool_state_t *pool_p, uint8_t *chunk_p); /** * @} diff --git a/src/mem/mem-poolman.cpp b/src/mem/mem-poolman.cpp index 08887d812..88be05330 100644 --- a/src/mem/mem-poolman.cpp +++ b/src/mem/mem-poolman.cpp @@ -27,7 +27,7 @@ #define JERRY_MEM_POOL_INTERNAL #include "jrt.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "mem-allocator.h" #include "mem-heap.h" #include "mem-pool.h" @@ -96,7 +96,7 @@ mem_pools_finalize (void) * @return true - if there is a free chunk in mem_pools, * false - otherwise (not enough memory). */ -static bool __noinline +static bool __attr_noinline___ mem_pools_alloc_longpath (void) { /** diff --git a/src/parser/collections/array-list.cpp b/src/parser/collections/array-list.cpp index 3c2338564..2cd7e5cc1 100644 --- a/src/parser/collections/array-list.cpp +++ b/src/parser/collections/array-list.cpp @@ -15,7 +15,7 @@ #include "array-list.h" #include "mem-heap.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #define ARRAY_LIST_MAGIC 0x39 diff --git a/src/parser/collections/hash-table.cpp b/src/parser/collections/hash-table.cpp index cbcf4d537..28544f13c 100644 --- a/src/parser/collections/hash-table.cpp +++ b/src/parser/collections/hash-table.cpp @@ -16,7 +16,7 @@ #include "hash-table.h" #include "array-list.h" #include "mem-heap.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #define HASH_MAP_MAGIC 0x67 diff --git a/src/parser/collections/linked-list.cpp b/src/parser/collections/linked-list.cpp index 4113a9a62..de0dccd12 100644 --- a/src/parser/collections/linked-list.cpp +++ b/src/parser/collections/linked-list.cpp @@ -14,7 +14,7 @@ */ #include "linked-list.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "jrt.h" #include "mem-heap.h" #include "lp-string.h" diff --git a/src/parser/collections/lit-id-hash-table.cpp b/src/parser/collections/lit-id-hash-table.cpp index a9ee71c10..a0becf9ec 100644 --- a/src/parser/collections/lit-id-hash-table.cpp +++ b/src/parser/collections/lit-id-hash-table.cpp @@ -15,7 +15,7 @@ #include "lit-id-hash-table.h" #include "mem-heap.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "bytecode-data.h" lit_id_hash_table * diff --git a/src/parser/collections/lp-string.cpp b/src/parser/collections/lp-string.cpp index 359beb0c7..2b98448db 100644 --- a/src/parser/collections/lp-string.cpp +++ b/src/parser/collections/lp-string.cpp @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ */ #include "lp-string.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" bool lp_string_equal (lp_string s1, lp_string s2) diff --git a/src/parser/collections/stack.h b/src/parser/collections/stack.h index 53953b0ad..0d175594b 100644 --- a/src/parser/collections/stack.h +++ b/src/parser/collections/stack.h @@ -88,37 +88,37 @@ do { \ } while (0) #define DEFINE_STACK_ELEMENT(NAME, TYPE) \ -static TYPE NAME##_stack_element (size_t) __unused; \ +static TYPE NAME##_stack_element (size_t) __attr_unused___; \ static TYPE NAME##_stack_element (size_t elem) { \ return *((TYPE *) array_list_element (NAME.data, elem)); \ } #define DEFINE_SET_STACK_ELEMENT(NAME, TYPE) \ -static void set_##NAME##_stack_element (size_t, TYPE) __unused; \ +static void set_##NAME##_stack_element (size_t, TYPE) __attr_unused___; \ static void set_##NAME##_stack_element (size_t elem, TYPE value) { \ array_list_set_element (NAME.data, elem, &value); \ } #define DEFINE_STACK_HEAD(NAME, TYPE) \ -static TYPE NAME##_stack_head (size_t) __unused; \ +static TYPE NAME##_stack_head (size_t) __attr_unused___; \ static TYPE NAME##_stack_head (size_t elem) { \ return *((TYPE *) array_list_last_element (NAME.data, elem)); \ } #define DEFINE_SET_STACK_HEAD(NAME, TYPE) \ -static void set_##NAME##_stack_head (size_t, TYPE) __unused; \ +static void set_##NAME##_stack_head (size_t, TYPE) __attr_unused___; \ static void set_##NAME##_stack_head (size_t elem, TYPE value) { \ array_list_set_last_element (NAME.data, elem, &value); \ } #define DEFINE_STACK_PUSH(NAME, TYPE) \ -static void NAME##_stack_push (TYPE) __unused; \ +static void NAME##_stack_push (TYPE) __attr_unused___; \ static void NAME##_stack_push (TYPE value) { \ NAME.data = array_list_append (NAME.data, &value); \ } #define DEFINE_CONVERT_TO_RAW_DATA(NAME, TYPE) \ -static TYPE *convert_##NAME##_to_raw_data (void) __unused; \ +static TYPE *convert_##NAME##_to_raw_data (void) __attr_unused___; \ static TYPE *convert_##NAME##_to_raw_data (void) { \ if (array_list_len (NAME.data) == 0) \ { \ diff --git a/src/parser/js/bytecode-data.h b/src/parser/js/bytecode-data.h index 289b46f2c..777644cf1 100644 --- a/src/parser/js/bytecode-data.h +++ b/src/parser/js/bytecode-data.h @@ -18,7 +18,7 @@ #include "opcodes.h" #include "stack.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "literal.h" #include "scopes-tree.h" #include "lit-id-hash-table.h" diff --git a/src/parser/js/lexer.cpp b/src/parser/js/lexer.cpp index 30cdccbd9..8ddbd80df 100644 --- a/src/parser/js/lexer.cpp +++ b/src/parser/js/lexer.cpp @@ -14,7 +14,7 @@ */ #include "mem-allocator.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "lexer.h" #include "parser.h" #include "stack.h" diff --git a/src/parser/js/literal.cpp b/src/parser/js/literal.cpp index 22fc1327c..b5de673d7 100644 --- a/src/parser/js/literal.cpp +++ b/src/parser/js/literal.cpp @@ -15,7 +15,7 @@ #include "literal.h" #include "ecma-helpers.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" literal create_empty_literal (void) diff --git a/src/parser/js/opcodes-dumper.cpp b/src/parser/js/opcodes-dumper.cpp index e4f13d03d..ab0544115 100644 --- a/src/parser/js/opcodes-dumper.cpp +++ b/src/parser/js/opcodes-dumper.cpp @@ -20,7 +20,7 @@ #include "lexer.h" #include "stack.h" #include "syntax-errors.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "opcodes-native-call.h" #define MIN_TEMP_NAME 128 diff --git a/src/parser/js/parser.cpp b/src/parser/js/parser.cpp index 34b6ac26e..e3186bf8c 100644 --- a/src/parser/js/parser.cpp +++ b/src/parser/js/parser.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "parser.h" #include "opcodes.h" #include "serializer.h" diff --git a/src/parser/js/scopes-tree.cpp b/src/parser/js/scopes-tree.cpp index 864fde970..33f077f11 100644 --- a/src/parser/js/scopes-tree.cpp +++ b/src/parser/js/scopes-tree.cpp @@ -15,7 +15,7 @@ #include "scopes-tree.h" #include "mem-heap.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "lexer.h" #include "bytecode-data.h" diff --git a/src/parser/js/serializer.cpp b/src/parser/js/serializer.cpp index 7f21ba972..5dff032d9 100644 --- a/src/parser/js/serializer.cpp +++ b/src/parser/js/serializer.cpp @@ -16,7 +16,7 @@ #include "jrt.h" #include "serializer.h" #include "parser.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "bytecode-data.h" #include "deserializer.h" #include "pretty-printer.h" diff --git a/src/parser/js/syntax-errors.cpp b/src/parser/js/syntax-errors.cpp index 914c39b70..82a0c344d 100644 --- a/src/parser/js/syntax-errors.cpp +++ b/src/parser/js/syntax-errors.cpp @@ -17,7 +17,7 @@ #include "stack.h" #include "jrt.h" #include "parser.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "ecma-helpers.h" typedef struct @@ -64,7 +64,7 @@ syntax_add_prop_name (operand op, prop_type pt) } void -syntax_check_for_duplication_of_prop_names (bool is_strict, locus loc __unused) +syntax_check_for_duplication_of_prop_names (bool is_strict, locus loc __attr_unused___) { if (STACK_SIZE (props) - STACK_TOP (U8) < 2) { @@ -145,7 +145,7 @@ void syntax_add_varg (operand op) } static void -emit_error_on_eval_and_arguments (operand op, locus loc __unused) +emit_error_on_eval_and_arguments (operand op, locus loc __attr_unused___) { if (op.type == OPERAND_LITERAL) { @@ -170,7 +170,7 @@ syntax_check_for_eval_and_arguments_in_strict_mode (operand op, bool is_strict, /* 13.1, 15.3.2 */ void -syntax_check_for_syntax_errors_in_formal_param_list (bool is_strict, locus loc __unused) +syntax_check_for_syntax_errors_in_formal_param_list (bool is_strict, locus loc __attr_unused___) { if (STACK_SIZE (props) - STACK_TOP (U8) < 2 || !is_strict) { @@ -200,7 +200,7 @@ syntax_check_for_syntax_errors_in_formal_param_list (bool is_strict, locus loc _ } void -syntax_check_delete (bool is_strict, locus loc __unused) +syntax_check_delete (bool is_strict, locus loc __attr_unused___) { if (is_strict) { diff --git a/src/parser/js/syntax-errors.h b/src/parser/js/syntax-errors.h index 0be724d07..532715a64 100644 --- a/src/parser/js/syntax-errors.h +++ b/src/parser/js/syntax-errors.h @@ -30,13 +30,13 @@ putchar (' '); \ } \ printf ("^\n"); \ - printf ("ERROR: Ln %d, Col %d: %s\n", line + 1, column + 1, MESSAGE); \ + printf ("ERROR: Ln %lu, Col %lu: %s\n", (unsigned long) (line + 1), (unsigned long) (column + 1), MESSAGE); \ jerry_fatal (ERR_PARSER); \ } while (0) #define PARSE_WARN(MESSAGE, LOCUS) do { \ size_t line, column; \ lexer_locus_to_line_and_column ((locus) (LOCUS), &line, &column); \ - printf ("WARNING: Ln %d, Col %d: %s\n", line + 1, column + 1, MESSAGE); \ + printf ("WARNING: Ln %lu, Col %lu: %s\n", (unsigned long) (line + 1), (unsigned long) (column + 1), MESSAGE); \ } while (0) #define PARSE_ERROR_VARG(MESSAGE, LOCUS, ...) do { \ size_t line, column; \ @@ -47,7 +47,7 @@ putchar (' '); \ } \ printf ("^\n"); \ - printf ("ERROR: Ln %d, Col %d: ", line + 1, column + 1); \ + printf ("ERROR: Ln %lu, Col %lu: ", (unsigned long) (line + 1), (unsigned long) (column + 1)); \ printf (MESSAGE, __VA_ARGS__); \ printf ("\n"); \ jerry_fatal (ERR_PARSER); \ @@ -61,7 +61,7 @@ putchar (' '); \ } \ printf ("^\n"); \ - printf ("SORRY, Unimplemented: Ln %d, Col %d: %s\n", line + 1, column + 1, MESSAGE); \ + printf ("SORRY, Unimplemented: Ln %lu, Col %lu: %s\n", (unsigned long) (line + 1), (unsigned long) (column + 1), MESSAGE); \ JERRY_UNIMPLEMENTED ("Unimplemented parser feature."); \ } while (0) #else /* JERRY_NDEBUG */ diff --git a/src/vm/opcodes-ecma-arithmetics.cpp b/src/vm/opcodes-ecma-arithmetics.cpp index a2287b13b..37a314c12 100644 --- a/src/vm/opcodes-ecma-arithmetics.cpp +++ b/src/vm/opcodes-ecma-arithmetics.cpp @@ -16,7 +16,7 @@ #include "opcodes.h" #include "opcodes-ecma-support.h" #include "ecma-number-arithmetic.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" /** * Number arithmetic operations. diff --git a/src/vm/opcodes-ecma-relational.cpp b/src/vm/opcodes-ecma-relational.cpp index 11e90b04b..08e74c769 100644 --- a/src/vm/opcodes-ecma-relational.cpp +++ b/src/vm/opcodes-ecma-relational.cpp @@ -231,8 +231,8 @@ opfunc_greater_or_equal_than (opcode_t opdata, /**< operation data */ * returned value must be freed with ecma_free_completion_value. */ ecma_completion_value_t -opfunc_instanceof (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_instanceof (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { const idx_t dst_idx = opdata.data.instanceof.dst; const idx_t left_var_idx = opdata.data.instanceof.var_left; @@ -277,8 +277,8 @@ opfunc_instanceof (opcode_t opdata __unused, /**< operation data */ * returned value must be freed with ecma_free_completion_value. */ ecma_completion_value_t -opfunc_in (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_in (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { const idx_t dst_idx = opdata.data.in.dst; const idx_t left_var_idx = opdata.data.in.var_left; diff --git a/src/vm/opcodes-native-call.cpp b/src/vm/opcodes-native-call.cpp index f3fb72999..11462ec20 100644 --- a/src/vm/opcodes-native-call.cpp +++ b/src/vm/opcodes-native-call.cpp @@ -21,10 +21,7 @@ #include "opcodes-native-call.h" -#include "actuators.h" -#include "common-io.h" -#include "sensors.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" /** * 'Native call' opcode handler. @@ -60,54 +57,12 @@ opfunc_native_call (opcode_t opdata, /**< operation data */ switch ((opcode_native_call_t)native_call_id_idx) { case OPCODE_NATIVE_CALL_LED_TOGGLE: - { - JERRY_ASSERT (args_number == 1); - ecma_number_t* num_p = ecma_get_number_from_value (arg_values[0]); - uint32_t int_num = ecma_number_to_uint32 (*num_p); - led_toggle (int_num); - - ret_value = ecma_make_empty_completion_value (); - break; - } case OPCODE_NATIVE_CALL_LED_ON: - { - JERRY_ASSERT (args_number == 1); - ecma_number_t* num_p = ecma_get_number_from_value (arg_values[0]); - uint32_t int_num = ecma_number_to_uint32 (*num_p); - led_on (int_num); - - ret_value = ecma_make_empty_completion_value (); - break; - } case OPCODE_NATIVE_CALL_LED_OFF: - { - JERRY_ASSERT (args_number == 1); - ecma_number_t* num_p = ecma_get_number_from_value (arg_values[0]); - uint32_t int_num = ecma_number_to_uint32 (*num_p); - led_off (int_num); - - ret_value = ecma_make_empty_completion_value (); - break; - } case OPCODE_NATIVE_CALL_LED_ONCE: - { - JERRY_ASSERT (args_number == 1); - ecma_number_t* num_p = ecma_get_number_from_value (arg_values[0]); - uint32_t int_num = ecma_number_to_uint32 (*num_p); - led_blink_once (int_num); - - ret_value = ecma_make_empty_completion_value (); - break; - } case OPCODE_NATIVE_CALL_WAIT: { - JERRY_ASSERT (args_number == 1); - ecma_number_t* num_p = ecma_get_number_from_value (arg_values[0]); - uint32_t int_num = ecma_number_to_uint32 (*num_p); - wait_ms (int_num); - - ret_value = ecma_make_empty_completion_value (); - break; + JERRY_UNIMPLEMENTED ("Device operations are not implemented."); } case OPCODE_NATIVE_CALL_PRINT: diff --git a/src/vm/opcodes.cpp b/src/vm/opcodes.cpp index acc5bda56..8f74d2e77 100644 --- a/src/vm/opcodes.cpp +++ b/src/vm/opcodes.cpp @@ -43,7 +43,7 @@ */ #define OP_UNIMPLEMENTED_LIST(op) \ - static char __unused unimplemented_list_end + static char __attr_unused___ unimplemented_list_end #define DEFINE_UNIMPLEMENTED_OP(op) \ ecma_completion_value_t opfunc_ ## op (opcode_t opdata, int_data_t *int_data) \ @@ -58,7 +58,7 @@ OP_UNIMPLEMENTED_LIST (DEFINE_UNIMPLEMENTED_OP); * 'Nop' opcode handler. */ ecma_completion_value_t -opfunc_nop (opcode_t opdata __unused, /**< operation data */ +opfunc_nop (opcode_t opdata __attr_unused___, /**< operation data */ int_data_t *int_data) /**< interpreter context */ { int_data->pos++; @@ -378,8 +378,8 @@ opfunc_post_decr (opcode_t opdata, /**< operation data */ * The opcode is meta-opcode that is not supposed to be executed. */ ecma_completion_value_t -opfunc_reg_var_decl (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_reg_var_decl (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { JERRY_UNREACHABLE (); } /* opfunc_reg_var_decl */ @@ -1047,8 +1047,8 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ * However, ecma_free_completion_value may be called for it, but it is a no-op. */ ecma_completion_value_t -opfunc_ret (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_ret (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { return ecma_make_return_completion_value (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED)); } /* opfunc_ret */ @@ -1063,8 +1063,8 @@ opfunc_ret (opcode_t opdata __unused, /**< operation data */ * However, ecma_free_completion_value may be called for it, but it is a no-op. */ ecma_completion_value_t -opfunc_retval (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_retval (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { ecma_completion_value_t ret_value; @@ -1087,8 +1087,8 @@ opfunc_retval (opcode_t opdata __unused, /**< operation data */ * returned value must be freed with ecma_free_completion_value. */ ecma_completion_value_t -opfunc_prop_getter (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_prop_getter (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { const idx_t lhs_var_idx = opdata.data.prop_getter.lhs; const idx_t base_var_idx = opdata.data.prop_getter.obj; @@ -1140,8 +1140,8 @@ opfunc_prop_getter (opcode_t opdata __unused, /**< operation data */ * returned value must be freed with ecma_free_completion_value. */ ecma_completion_value_t -opfunc_prop_setter (opcode_t opdata __unused, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ +opfunc_prop_setter (opcode_t opdata __attr_unused___, /**< operation data */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { const idx_t base_var_idx = opdata.data.prop_setter.obj; const idx_t prop_name_var_idx = opdata.data.prop_setter.prop; @@ -1198,7 +1198,7 @@ opfunc_prop_setter (opcode_t opdata __unused, /**< operation data */ */ ecma_completion_value_t opfunc_exitval (opcode_t opdata, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { JERRY_ASSERT (opdata.data.exitval.status_code == 0 || opdata.data.exitval.status_code == 1); @@ -1633,7 +1633,7 @@ opfunc_delete_prop (opcode_t opdata, /**< operation data */ */ ecma_completion_value_t opfunc_meta (opcode_t opdata, /**< operation data */ - int_data_t *int_data __unused) /**< interpreter context */ + int_data_t *int_data __attr_unused___) /**< interpreter context */ { const opcode_meta_type type = (opcode_meta_type) opdata.data.meta.type; diff --git a/src/vm/pretty-printer.cpp b/src/vm/pretty-printer.cpp index 9edf7f8a3..120e2b644 100644 --- a/src/vm/pretty-printer.cpp +++ b/src/vm/pretty-printer.cpp @@ -16,7 +16,7 @@ #include "jrt.h" #ifdef JERRY_ENABLE_PRETTY_PRINTER #include "pretty-printer.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "lexer.h" #include "deserializer.h" #include "opcodes-native-call.h" @@ -30,7 +30,7 @@ #name, #define __OPCODE_SIZE(name, arg1, arg2, arg3) \ - sizeof (__op_##name) + 1, + (uint8_t) (sizeof (__op_##name) + 1), static const char* opcode_names[] = { @@ -57,7 +57,7 @@ dump_literal (literal lit) } else { - printf ("%d : NUMBER", lit.data.num); + printf ("%d : Truncated NUMBER", (int) lit.data.num); } break; } @@ -81,10 +81,10 @@ dump_literal (literal lit) void pp_literals (const literal lits[], literal_index_t size) { - printf ("LITERALS %d:\n", size); + printf ("LITERALS %lu:\n", (unsigned long) size); for (literal_index_t i = 0; i < size; i++) { - printf ("%3d ", i); + printf ("%3lu ", (unsigned long) i); dump_literal (lits[i]); putchar ('\n'); } diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp index 3a6e39402..29c34f3ab 100644 --- a/src/vm/vm.cpp +++ b/src/vm/vm.cpp @@ -23,7 +23,7 @@ #include "ecma-stack.h" #include "jrt.h" #include "vm.h" -#include "jerry-libc.h" +#include "jrt-libc-includes.h" #include "mem-allocator.h" #define __INIT_OP_FUNC(name, arg1, arg2, arg3) [ __op__idx_##name ] = opfunc_##name, @@ -133,10 +133,10 @@ interp_mem_stats_context_enter (int_data_t *int_data_p, "%s Pools: %5u\n" "%s Allocated pool chunks: %5u\n\n", indent_prefix, (uint32_t) block_position, - indent_prefix, int_data_p->heap_stats_context_enter.allocated_bytes, - indent_prefix, int_data_p->heap_stats_context_enter.waste_bytes, - indent_prefix, int_data_p->pools_stats_context_enter.pools_count, - indent_prefix, int_data_p->pools_stats_context_enter.allocated_chunks); + indent_prefix, (uint32_t) int_data_p->heap_stats_context_enter.allocated_bytes, + indent_prefix, (uint32_t) int_data_p->heap_stats_context_enter.waste_bytes, + indent_prefix, (uint32_t) int_data_p->pools_stats_context_enter.pools_count, + indent_prefix, (uint32_t) int_data_p->pools_stats_context_enter.allocated_chunks); } static void @@ -174,35 +174,36 @@ interp_mem_stats_context_exit (int_data_t *int_data_p, printf ("%sAllocated heap bytes in the context: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - int_data_p->heap_stats_context_enter.allocated_bytes, - heap_stats_context_exit.allocated_bytes, - heap_stats_context_exit.allocated_bytes - int_data_p->heap_stats_context_enter.allocated_bytes, - int_data_p->context_peak_allocated_heap_bytes, - heap_stats_context_exit.global_peak_allocated_bytes); + (uint32_t) int_data_p->heap_stats_context_enter.allocated_bytes, + (uint32_t) heap_stats_context_exit.allocated_bytes, + (uint32_t) (heap_stats_context_exit.allocated_bytes - int_data_p->heap_stats_context_enter.allocated_bytes), + (uint32_t) int_data_p->context_peak_allocated_heap_bytes, + (uint32_t) heap_stats_context_exit.global_peak_allocated_bytes); printf ("%sWaste heap bytes in the context: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - int_data_p->heap_stats_context_enter.waste_bytes, - heap_stats_context_exit.waste_bytes, - heap_stats_context_exit.waste_bytes - int_data_p->heap_stats_context_enter.waste_bytes, - int_data_p->context_peak_waste_heap_bytes, - heap_stats_context_exit.global_peak_waste_bytes); + (uint32_t) int_data_p->heap_stats_context_enter.waste_bytes, + (uint32_t) heap_stats_context_exit.waste_bytes, + (uint32_t) (heap_stats_context_exit.waste_bytes - int_data_p->heap_stats_context_enter.waste_bytes), + (uint32_t) int_data_p->context_peak_waste_heap_bytes, + (uint32_t) heap_stats_context_exit.global_peak_waste_bytes); printf ("%sPools count in the context: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - int_data_p->pools_stats_context_enter.pools_count, - pools_stats_context_exit.pools_count, - pools_stats_context_exit.pools_count - int_data_p->pools_stats_context_enter.pools_count, - int_data_p->context_peak_pools_count, - pools_stats_context_exit.global_peak_pools_count); + (uint32_t) int_data_p->pools_stats_context_enter.pools_count, + (uint32_t) pools_stats_context_exit.pools_count, + (uint32_t) (pools_stats_context_exit.pools_count - int_data_p->pools_stats_context_enter.pools_count), + (uint32_t) int_data_p->context_peak_pools_count, + (uint32_t) pools_stats_context_exit.global_peak_pools_count); printf ("%sAllocated pool chunks in the context: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - int_data_p->pools_stats_context_enter.allocated_chunks, - pools_stats_context_exit.allocated_chunks, - pools_stats_context_exit.allocated_chunks - int_data_p->pools_stats_context_enter.allocated_chunks, - int_data_p->context_peak_allocated_pool_chunks, - pools_stats_context_exit.global_peak_allocated_chunks); + (uint32_t) int_data_p->pools_stats_context_enter.allocated_chunks, + (uint32_t) pools_stats_context_exit.allocated_chunks, + (uint32_t) (pools_stats_context_exit.allocated_chunks - + int_data_p->pools_stats_context_enter.allocated_chunks), + (uint32_t) int_data_p->context_peak_allocated_pool_chunks, + (uint32_t) pools_stats_context_exit.global_peak_allocated_chunks); printf ("\n%s--- End of interpretation of a block at position %u ---\n\n", indent_prefix, (uint32_t) block_position); @@ -279,47 +280,47 @@ interp_mem_stats_opcode_exit (int_data_t *int_data_p, printf ("%s Allocated heap bytes: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - heap_stats_before_p->allocated_bytes, - heap_stats_after.allocated_bytes, - heap_stats_after.allocated_bytes - heap_stats_before_p->allocated_bytes, - heap_stats_after.peak_allocated_bytes - JERRY_MAX (heap_stats_before_p->allocated_bytes, - heap_stats_after.allocated_bytes), - heap_stats_after.global_peak_allocated_bytes); + (uint32_t) heap_stats_before_p->allocated_bytes, + (uint32_t) heap_stats_after.allocated_bytes, + (uint32_t) (heap_stats_after.allocated_bytes - heap_stats_before_p->allocated_bytes), + (uint32_t) (heap_stats_after.peak_allocated_bytes - JERRY_MAX (heap_stats_before_p->allocated_bytes, + heap_stats_after.allocated_bytes)), + (uint32_t) heap_stats_after.global_peak_allocated_bytes); if (heap_stats_before_p->waste_bytes != heap_stats_after.waste_bytes) { printf ("%s Waste heap bytes: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - heap_stats_before_p->waste_bytes, - heap_stats_after.waste_bytes, - heap_stats_after.waste_bytes - heap_stats_before_p->waste_bytes, - heap_stats_after.peak_waste_bytes - JERRY_MAX (heap_stats_before_p->waste_bytes, - heap_stats_after.waste_bytes), - heap_stats_after.global_peak_waste_bytes); + (uint32_t) heap_stats_before_p->waste_bytes, + (uint32_t) heap_stats_after.waste_bytes, + (uint32_t) (heap_stats_after.waste_bytes - heap_stats_before_p->waste_bytes), + (uint32_t) (heap_stats_after.peak_waste_bytes - JERRY_MAX (heap_stats_before_p->waste_bytes, + heap_stats_after.waste_bytes)), + (uint32_t) heap_stats_after.global_peak_waste_bytes); } if (pools_stats_before_p->pools_count != pools_stats_after.pools_count) { printf ("%s Pools: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - pools_stats_before_p->pools_count, - pools_stats_after.pools_count, - pools_stats_after.pools_count - pools_stats_before_p->pools_count, - pools_stats_after.peak_pools_count - JERRY_MAX (pools_stats_before_p->pools_count, - pools_stats_after.pools_count), - pools_stats_after.global_peak_pools_count); + (uint32_t) pools_stats_before_p->pools_count, + (uint32_t) pools_stats_after.pools_count, + (uint32_t) (pools_stats_after.pools_count - pools_stats_before_p->pools_count), + (uint32_t) (pools_stats_after.peak_pools_count - JERRY_MAX (pools_stats_before_p->pools_count, + pools_stats_after.pools_count)), + (uint32_t) pools_stats_after.global_peak_pools_count); } if (pools_stats_before_p->allocated_chunks != pools_stats_after.allocated_chunks) { printf ("%s Allocated pool chunks: %5u -> %5u (%+5d, local %5u, peak %5u)\n", indent_prefix, - pools_stats_before_p->allocated_chunks, - pools_stats_after.allocated_chunks, - pools_stats_after.allocated_chunks - pools_stats_before_p->allocated_chunks, - pools_stats_after.peak_allocated_chunks - JERRY_MAX (pools_stats_before_p->allocated_chunks, - pools_stats_after.allocated_chunks), - pools_stats_after.global_peak_allocated_chunks); + (uint32_t) pools_stats_before_p->allocated_chunks, + (uint32_t) pools_stats_after.allocated_chunks, + (uint32_t) (pools_stats_after.allocated_chunks - pools_stats_before_p->allocated_chunks), + (uint32_t) (pools_stats_after.peak_allocated_chunks - JERRY_MAX (pools_stats_before_p->allocated_chunks, + pools_stats_after.allocated_chunks)), + (uint32_t) pools_stats_after.global_peak_allocated_chunks); } printf ("%s-- End of execution of opcode %s (position %u) --\n\n", diff --git a/tests/unit/common.h b/tests/unit/common.h index 3b6a875c1..f897d4aea 100644 --- a/tests/unit/common.h +++ b/tests/unit/common.h @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ static uint8_t opcode_sizes[] = { 0 }; -static bool opcodes_equal (const opcode_t *, opcode_t *, uint16_t) __unused; +static bool opcodes_equal (const opcode_t *, opcode_t *, uint16_t) __attr_unused___; static bool opcodes_equal (const opcode_t *opcodes1, opcode_t *opcodes2, uint16_t size) diff --git a/tests/unit/test_heap.cpp b/tests/unit/test_heap.cpp index 2dbc63c90..4ca870661 100644 --- a/tests/unit/test_heap.cpp +++ b/tests/unit/test_heap.cpp @@ -83,8 +83,8 @@ test_heap_give_some_memory_back (mem_try_give_memory_back_severity_t severity) } /* test_heap_give_some_memory_back */ int -main( int __unused argc, - char __unused **argv) +main( int __attr_unused___ argc, + char __attr_unused___ **argv) { uint8_t test_native_heap[test_heap_size]; diff --git a/tests/unit/test_number_to_string.cpp b/tests/unit/test_number_to_string.cpp index ea470f623..b45c25d13 100644 --- a/tests/unit/test_number_to_string.cpp +++ b/tests/unit/test_number_to_string.cpp @@ -24,8 +24,8 @@ * Unit test's main function. */ int -main( int __unused argc, - char __unused **argv) +main( int __attr_unused___ argc, + char __attr_unused___ **argv) { const ecma_char_t* zt_strings[] = { diff --git a/tests/unit/test_pool.cpp b/tests/unit/test_pool.cpp index e3709831e..a72ae905b 100644 --- a/tests/unit/test_pool.cpp +++ b/tests/unit/test_pool.cpp @@ -41,8 +41,8 @@ uint8_t test_pool [TEST_POOL_SPACE_SIZE] __attribute__((aligned(MEM_ALIGNMENT))) uint8_t* ptrs[test_max_sub_iters]; int -main( int __unused argc, - char __unused **argv) +main( int __attr_unused___ argc, + char __attr_unused___ **argv) { srand((unsigned int) time(NULL)); int k = rand(); diff --git a/tests/unit/test_poolman.cpp b/tests/unit/test_poolman.cpp index 9bdb5e6ca..5eb053789 100644 --- a/tests/unit/test_poolman.cpp +++ b/tests/unit/test_poolman.cpp @@ -41,8 +41,8 @@ const uint32_t test_max_sub_iters = 32; uint8_t *ptrs[test_max_sub_iters]; int -main( int __unused argc, - char __unused **argv) +main( int __attr_unused___ argc, + char __attr_unused___ **argv) { mem_init(); diff --git a/tests/unit/test_preparser.cpp b/tests/unit/test_preparser.cpp index 2cc7d68d2..5846c6207 100644 --- a/tests/unit/test_preparser.cpp +++ b/tests/unit/test_preparser.cpp @@ -25,8 +25,8 @@ * Unit test's main function. */ int -main( int __unused argc, - char __unused **argv) +main( int __attr_unused___ argc, + char __attr_unused___ **argv) { char program[] = "a=1;var a;"; bool is_ok; diff --git a/tests/unit/test_string_to_number.cpp b/tests/unit/test_string_to_number.cpp index e9af47b86..2ef79147b 100644 --- a/tests/unit/test_string_to_number.cpp +++ b/tests/unit/test_string_to_number.cpp @@ -24,8 +24,8 @@ * Unit test's main function. */ int -main( int __unused argc, - char __unused **argv) +main( int __attr_unused___ argc, + char __attr_unused___ **argv) { const ecma_char_t* zt_strings[] = {