From: Aleksei Vereshchagin Date: Wed, 28 Mar 2018 02:05:30 +0000 (+0300) Subject: Update build system scripts X-Git-Tag: submit/tizen/20180619.075036^2~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bf45c54c2b4de1ef5d3956b69fa469be32910cba;p=sdk%2Ftools%2Fcoreprofiler.git Update build system scripts --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37cfe8d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Proposed build directory according to README +/build/ + +# ctags generated file +.tags diff --git a/CMakeLists.txt b/CMakeLists.txt index ae26daf..cb2470c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,32 +1,62 @@ cmake_minimum_required(VERSION 2.8.12.2) +# Compiler-specific options +set(CMAKE_C_COMPILER clang CACHE FILEPATH "Path to CC compiler") +set(CMAKE_CXX_COMPILER clang++ CACHE FILEPATH "Path to CXX compiler") +set(CMAKE_USER_MAKE_RULES_OVERRIDE clang-compiler-override.txt CACHE FILEPATH + "Path to platform information overrides" +) + +# Set the project name project(CoreProfiler) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-null-conversion") - -set(CLR_CMAKE_PLATFORM_UNIX 1) - -# Architecture specific files folder name -if (CLR_CMAKE_TARGET_ARCH_AMD64) - set(ARCH_SOURCES_DIR amd64) - set(CLR_CMAKE_PLATFORM_UNIX_AMD64) -elseif (CLR_CMAKE_TARGET_ARCH_ARM64) - set(ARCH_SOURCES_DIR arm64) - set(CLR_CMAKE_PLATFORM_UNIX_ARM64) -elseif (CLR_CMAKE_TARGET_ARCH_ARM) - set(ARCH_SOURCES_DIR arm) - set(CLR_CMAKE_PLATFORM_UNIX_ARM) -elseif (CLR_CMAKE_TARGET_ARCH_I386) - set(ARCH_SOURCES_DIR i386) - set(CLR_CMAKE_PLATFORM_UNIX_I386) -else () - clr_unknown_arch() -endif () - -enable_language(ASM) -set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") - -include(clrdefinitions.cmake) -include(compileoptions.cmake) +# Setup default build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug CACHE STRING + "Choose the type of build" FORCE + ) +endif() + +# Setup install prefix + +set(CMAKE_INSTALL_PREFIX_OVERRIDE ${PROJECT_BINARY_DIR}/install CACHE PATH + "Use to override CMAKE_INSTALL_PREFIX" +) + +set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX_OVERRIDE} CACHE INTERNAL + "CMAKE_INSTALL_PREFIX overrided by CMAKE_INSTALL_PREFIX_OVERRIDE" +) + +# Load CoreCLR-specific configuration +include(clr.cmake) + +# Enable compability with standard libs +add_definitions(-DPAL_STDCPP_COMPAT) + +# Default paths to CoreCLR sources/binaries +set(CLR_SRC_DIR $ENV{HOME}/coreclr CACHE PATH + "Path to CoreCLR source root" +) +set(CLR_BIN_DIR + ${CLR_SRC_DIR}/bin/Product/Linux.${CLR_CMAKE_HOST_ARCH}.${CMAKE_BUILD_TYPE} + CACHE PATH + "Path to CoreCLR build output" +) + +# Include directory directives +include_directories("${CLR_SRC_DIR}/src/pal/prebuilt/inc") +include_directories("${CLR_SRC_DIR}/src/pal/inc") +include_directories("${CLR_SRC_DIR}/src/pal/inc/rt") +include_directories("${CLR_SRC_DIR}/src/inc") +include_directories("${CLR_BIN_DIR}/inc") + +# Import CoreCLR libraries +foreach(static_lib libcorguids libcoreclrpal libpalrt) + add_library(${static_lib} STATIC IMPORTED) + set_target_properties(${static_lib} PROPERTIES + IMPORTED_LOCATION ${CLR_BIN_DIR}/lib/${static_lib}.a + ) +endforeach() +# Add Product Directory add_subdirectory(src) diff --git a/clang-compiler-override-arm.txt b/clang-compiler-override-arm.txt deleted file mode 100644 index da25715..0000000 --- a/clang-compiler-override-arm.txt +++ /dev/null @@ -1,20 +0,0 @@ -SET (CMAKE_C_FLAGS_INIT "-Wall -std=c11") -SET (CMAKE_C_FLAGS_DEBUG_INIT "-g -O0") -SET (CLR_C_FLAGS_CHECKED_INIT "-g -O1") -# Refer to the below instruction to support __thread with -O2/-O3 on Linux/ARM -# https://github.com/dotnet/coreclr/blob/master/Documentation/building/linux-instructions.md -SET (CMAKE_C_FLAGS_RELEASE_INIT "-g -O1") -SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-g -O1") - -SET (CMAKE_CXX_FLAGS_INIT "-Wall -Wno-null-conversion -std=c++11") -SET (CMAKE_CXX_FLAGS_DEBUG_INIT "-g -O0") -SET (CLR_CXX_FLAGS_CHECKED_INIT "-g -O1") -SET (CMAKE_CXX_FLAGS_RELEASE_INIT "-g -O1") -SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-g -O1") - -SET (CLR_DEFINES_DEBUG_INIT DEBUG _DEBUG _DBG URTBLDENV_FRIENDLY=Checked BUILDENV_CHECKED=1) -SET (CLR_DEFINES_CHECKED_INIT DEBUG _DEBUG _DBG URTBLDENV_FRIENDLY=Checked BUILDENV_CHECKED=1) -SET (CLR_DEFINES_RELEASE_INIT NDEBUG URTBLDENV_FRIENDLY=Retail) -SET (CLR_DEFINES_RELWITHDEBINFO_INIT NDEBUG URTBLDENV_FRIENDLY=Retail) - -SET (CMAKE_INSTALL_PREFIX $ENV{__CMakeBinDir}) diff --git a/clr.cmake b/clr.cmake new file mode 100644 index 0000000..0294627 --- /dev/null +++ b/clr.cmake @@ -0,0 +1,171 @@ +include(functions.cmake) + +option(CLR_CMAKE_WARNINGS_ARE_ERRORS "Warnings are errors" ON) + +enable_language(ASM) + +#---------------------------------------- +# Detect and set platform variable names +# - for non-windows build platform & architecture is detected using inbuilt CMAKE variables and cross target component configure +# - for windows we use the passed in parameter to CMAKE to determine build arch +#---------------------------------------- +set(CLR_CMAKE_PLATFORM_UNIX 1) + +# CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p` on target. +# For the AMD/Intel 64bit architecture two different strings are common. +# Linux and Darwin identify it as "x86_64" while FreeBSD and netbsd uses the +# "amd64" string. Accept either of the two here. +if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) + set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) + set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL arm) + set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) + set(CLR_CMAKE_PLATFORM_UNIX_X86 1) +else() + clr_unknown_arch() +endif() + +set(CLR_CMAKE_PLATFORM_LINUX 1) + +# Detect Linux ID +if(DEFINED CLR_CMAKE_LINUX_ID) + if(CLR_CMAKE_LINUX_ID STREQUAL ubuntu) + set(CLR_CMAKE_TARGET_UBUNTU_LINUX 1) + elseif(CLR_CMAKE_LINUX_ID STREQUAL tizen) + set(CLR_CMAKE_TARGET_TIZEN_LINUX 1) + elseif(CLR_CMAKE_LINUX_ID STREQUAL alpine) + set(CLR_CMAKE_PLATFORM_ALPINE_LINUX 1) + endif() + if(CLR_CMAKE_LINUX_ID STREQUAL ubuntu) + set(CLR_CMAKE_PLATFORM_UBUNTU_LINUX 1) + endif() +endif(DEFINED CLR_CMAKE_LINUX_ID) + +# Set HOST architecture variables +if(CLR_CMAKE_PLATFORM_UNIX_ARM) + set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) + set(CLR_CMAKE_HOST_ARCH "arm") +elseif(CLR_CMAKE_PLATFORM_UNIX_ARM64) + set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) + set(CLR_CMAKE_HOST_ARCH "arm64") +elseif(CLR_CMAKE_PLATFORM_UNIX_AMD64) + set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1) + set(CLR_CMAKE_HOST_ARCH "x64") +elseif(CLR_CMAKE_PLATFORM_UNIX_X86) + set(CLR_CMAKE_PLATFORM_ARCH_I386 1) + set(CLR_CMAKE_HOST_ARCH "x86") +endif() + +# Set TARGET architecture variables +if(NOT DEFINED CLR_CMAKE_TARGET_ARCH OR CLR_CMAKE_TARGET_ARCH STREQUAL "" ) + set(CLR_CMAKE_TARGET_ARCH ${CLR_CMAKE_HOST_ARCH}) +endif() + +# Set target architecture variables +if (CLR_CMAKE_TARGET_ARCH STREQUAL x64) + set(CLR_CMAKE_TARGET_ARCH_AMD64 1) + elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86) + set(CLR_CMAKE_TARGET_ARCH_I386 1) + elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm64) + set(CLR_CMAKE_TARGET_ARCH_ARM64 1) + elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm) + set(CLR_CMAKE_TARGET_ARCH_ARM 1) + else() + clr_unknown_arch() +endif() + +#----------------------------------------------------- +# Initialize Cmake compiler flags and other variables +#----------------------------------------------------- + +# Set the values to display when interactively configuring CMAKE_BUILD_TYPE +set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "DEBUG;RELEASE;RELWITHDEBINFO") + +# Use uppercase CMAKE_BUILD_TYPE for the string comparisons below +string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) + +# For single-configuration toolset +# set the different configuration defines. +if (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG) + # First DEBUG + set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_DEBUG_INIT}) +elseif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE) + # Then RELEASE + set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_RELEASE_INIT}) +elseif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO) + # And then RELWITHDEBINFO + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_RELWITHDEBINFO_INIT}) +else () + message(FATAL_ERROR "Unknown build type! Set CMAKE_BUILD_TYPE to DEBUG, RELEASE, or RELWITHDEBINFO!") +endif () + +# CLR_ADDITIONAL_LINKER_FLAGS - used for passing additional arguments to linker +# CLR_ADDITIONAL_COMPILER_OPTIONS - used for passing additional arguments to compiler +# +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CLR_ADDITIONAL_LINKER_FLAGS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CLR_ADDITIONAL_LINKER_FLAGS}" ) +add_compile_options(${CLR_ADDITIONAL_COMPILER_OPTIONS}) + +set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1") + +#------------------------------------ +# Definitions (for platform) +#----------------------------------- +if (CLR_CMAKE_PLATFORM_ARCH_AMD64) + add_definitions(-D_AMD64_) + add_definitions(-D_WIN64) + add_definitions(-DAMD64) + add_definitions(-DBIT64=1) +elseif (CLR_CMAKE_PLATFORM_ARCH_I386) + add_definitions(-D_X86_) +elseif (CLR_CMAKE_PLATFORM_ARCH_ARM) + add_definitions(-D_ARM_) + add_definitions(-DARM) +elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64) + add_definitions(-D_ARM64_) + add_definitions(-DARM64) + add_definitions(-D_WIN64) + add_definitions(-DBIT64=1) +else () + clr_unknown_arch() +endif () + +add_definitions(-DPLATFORM_UNIX=1) + +if(CLR_CMAKE_PLATFORM_UNIX_AMD64) + message("Detected Linux x86_64") + add_definitions(-DLINUX64) +elseif(CLR_CMAKE_PLATFORM_UNIX_ARM) + message("Detected Linux ARM") + add_definitions(-DLINUX32) +elseif(CLR_CMAKE_PLATFORM_UNIX_ARM64) + message("Detected Linux ARM64") + add_definitions(-DLINUX64) +elseif(CLR_CMAKE_PLATFORM_UNIX_X86) + message("Detected Linux i686") + add_definitions(-DLINUX32) +else() + clr_unknown_arch() +endif() + +# Architecture specific files folder name +if (CLR_CMAKE_TARGET_ARCH_AMD64) + set(ARCH_SOURCES_DIR amd64) +elseif (CLR_CMAKE_TARGET_ARCH_ARM64) + set(ARCH_SOURCES_DIR arm64) +elseif (CLR_CMAKE_TARGET_ARCH_ARM) + set(ARCH_SOURCES_DIR arm) +elseif (CLR_CMAKE_TARGET_ARCH_I386) + set(ARCH_SOURCES_DIR i386) +else () + clr_unknown_arch() +endif () + +include(compileoptions.cmake) +include(clrdefinitions.cmake) diff --git a/clrdefinitions.cmake b/clrdefinitions.cmake index e077efc..5c1149e 100644 --- a/clrdefinitions.cmake +++ b/clrdefinitions.cmake @@ -3,26 +3,20 @@ if (CLR_CMAKE_TARGET_ARCH_AMD64) add_definitions(-DDBG_TARGET_AMD64_UNIX) endif() add_definitions(-D_TARGET_AMD64_=1) + add_definitions(-D_TARGET_64BIT_=1) add_definitions(-DDBG_TARGET_64BIT=1) add_definitions(-DDBG_TARGET_AMD64=1) add_definitions(-DDBG_TARGET_WIN64=1) - add_definitions(-D_AMD64_) - add_definitions(-D_WIN64) - add_definitions(-DAMD64) - add_definitions(-DBIT64=1) elseif (CLR_CMAKE_TARGET_ARCH_ARM64) if (CLR_CMAKE_PLATFORM_UNIX) add_definitions(-DDBG_TARGET_ARM64_UNIX) endif() add_definitions(-D_TARGET_ARM64_=1) + add_definitions(-D_TARGET_64BIT_=1) add_definitions(-DDBG_TARGET_64BIT=1) add_definitions(-DDBG_TARGET_ARM64=1) add_definitions(-DDBG_TARGET_WIN64=1) add_definitions(-DFEATURE_MULTIREG_RETURN) - add_definitions(-D_ARM64_) - add_definitions(-DARM64) - add_definitions(-D_WIN64) - add_definitions(-DBIT64=1) elseif (CLR_CMAKE_TARGET_ARCH_ARM) if (CLR_CMAKE_PLATFORM_UNIX) add_definitions(-DDBG_TARGET_ARM_UNIX) @@ -34,14 +28,190 @@ elseif (CLR_CMAKE_TARGET_ARCH_ARM) add_definitions(-D_TARGET_ARM_=1) add_definitions(-DDBG_TARGET_32BIT=1) add_definitions(-DDBG_TARGET_ARM=1) - add_definitions(-D_ARM_) - add_definitions(-DARM) elseif (CLR_CMAKE_TARGET_ARCH_I386) add_definitions(-D_TARGET_X86_=1) add_definitions(-DDBG_TARGET_32BIT=1) add_definitions(-DDBG_TARGET_X86=1) - add_definitions(-D_X86_) else () clr_unknown_arch() endif (CLR_CMAKE_TARGET_ARCH_AMD64) +if (CLR_CMAKE_PLATFORM_UNIX) + + if(CLR_CMAKE_PLATFORM_DARWIN) + add_definitions(-D_XOPEN_SOURCE) + add_definitions(-DFEATURE_DATATARGET4) + endif(CLR_CMAKE_PLATFORM_DARWIN) + + if (CLR_CMAKE_TARGET_ARCH_AMD64) + add_definitions(-DUNIX_AMD64_ABI) + elseif (CLR_CMAKE_TARGET_ARCH_ARM) + add_definitions(-DUNIX_ARM_ABI) + add_definitions(-DFEATURE_DATATARGET4) + elseif (CLR_CMAKE_TARGET_ARCH_I386) + add_definitions(-DUNIX_X86_ABI) + endif() + +endif(CLR_CMAKE_PLATFORM_UNIX) + +if(CLR_CMAKE_PLATFORM_ALPINE_LINUX) + # Alpine Linux doesn't have fixed stack limit, this define disables some stack pointer + # sanity checks in debug / checked build that rely on a fixed stack limit + add_definitions(-DNO_FIXED_STACK_LIMIT) +endif(CLR_CMAKE_PLATFORM_ALPINE_LINUX) + +# add_definitions(-D_BLD_CLR) +add_definitions(-DDEBUGGING_SUPPORTED) +add_definitions(-DPROFILING_SUPPORTED) + +if(WIN32) + add_definitions(-DWIN32) + add_definitions(-D_WIN32) + add_definitions(-DWINVER=0x0602) + add_definitions(-D_WIN32_WINNT=0x0602) + add_definitions(-DWIN32_LEAN_AND_MEAN=1) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + if(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) + # Only enable edit and continue on windows x86 and x64 + # exclude Linux, arm & arm64 + add_definitions(-DEnC_SUPPORTED) + endif(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) +endif(WIN32) + +# Features - please keep them alphabetically sorted +if (FEATURE_APPDOMAIN_RESOURCE_MONITORING) + add_definitions(-DFEATURE_APPDOMAIN_RESOURCE_MONITORING) +endif(FEATURE_APPDOMAIN_RESOURCE_MONITORING) + +if(WIN32) + add_definitions(-DFEATURE_APPX) + if(NOT CLR_CMAKE_TARGET_ARCH_I386) + add_definitions(-DFEATURE_ARRAYSTUB_AS_IL) + add_definitions(-DFEATURE_MULTICASTSTUB_AS_IL) + endif() +else(WIN32) + add_definitions(-DFEATURE_ARRAYSTUB_AS_IL) + add_definitions(-DFEATURE_MULTICASTSTUB_AS_IL) +endif(WIN32) +add_definitions(-DFEATURE_CODE_VERSIONING) +add_definitions(-DFEATURE_COLLECTIBLE_TYPES) + +if(WIN32) + add_definitions(-DFEATURE_CLASSIC_COMINTEROP) + add_definitions(-DFEATURE_COMINTEROP) + add_definitions(-DFEATURE_COMINTEROP_APARTMENT_SUPPORT) + add_definitions(-DFEATURE_COMINTEROP_UNMANAGED_ACTIVATION) + add_definitions(-DFEATURE_COMINTEROP_WINRT_MANAGED_ACTIVATION) +endif(WIN32) + +add_definitions(-DFEATURE_CORECLR) +if (CLR_CMAKE_PLATFORM_UNIX) + add_definitions(-DFEATURE_COREFX_GLOBALIZATION) +endif(CLR_CMAKE_PLATFORM_UNIX) +add_definitions(-DFEATURE_CORESYSTEM) +add_definitions(-DFEATURE_CORRUPTING_EXCEPTIONS) +if(FEATURE_DBGIPC) + add_definitions(-DFEATURE_DBGIPC_TRANSPORT_DI) + add_definitions(-DFEATURE_DBGIPC_TRANSPORT_VM) +endif(FEATURE_DBGIPC) +if(FEATURE_EVENT_TRACE) + add_definitions(-DFEATURE_EVENT_TRACE=1) + add_definitions(-DFEATURE_PERFTRACING=1) +endif(FEATURE_EVENT_TRACE) +if(FEATURE_GDBJIT) + add_definitions(-DFEATURE_GDBJIT) +endif() +if(FEATURE_GDBJIT_FRAME) + add_definitions(-DFEATURE_GDBJIT_FRAME) +endif(FEATURE_GDBJIT_FRAME) +if(FEATURE_GDBJIT_LANGID_CS) + add_definitions(-DFEATURE_GDBJIT_LANGID_CS) +endif(FEATURE_GDBJIT_LANGID_CS) +if(FEATURE_GDBJIT_SYMTAB) + add_definitions(-DFEATURE_GDBJIT_SYMTAB) +endif(FEATURE_GDBJIT_SYMTAB) +if(CLR_CMAKE_PLATFORM_UNIX) + add_definitions(-DFEATURE_EVENTSOURCE_XPLAT=1) +endif(CLR_CMAKE_PLATFORM_UNIX) +# NetBSD doesn't implement this feature +if(NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD) + add_definitions(-DFEATURE_HIJACK) +endif(NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD) +add_definitions(-DFEATURE_ICASTABLE) +if (WIN32 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386)) + add_definitions(-DFEATURE_INTEROP_DEBUGGING) +endif (WIN32 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386)) +if(FEATURE_INTERPRETER) + add_definitions(-DFEATURE_INTERPRETER) +endif(FEATURE_INTERPRETER) +add_definitions(-DFEATURE_ISYM_READER) +if(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) + add_definitions(-DFEATURE_JUMPSTAMP) + endif(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) +add_definitions(-DFEATURE_LOADER_OPTIMIZATION) +if (CLR_CMAKE_PLATFORM_LINUX OR WIN32) + add_definitions(-DFEATURE_MANAGED_ETW) +endif(CLR_CMAKE_PLATFORM_LINUX OR WIN32) +add_definitions(-DFEATURE_MANAGED_ETW_CHANNELS) + +if(FEATURE_MERGE_JIT_AND_ENGINE) + add_definitions(-DFEATURE_MERGE_JIT_AND_ENGINE) +endif(FEATURE_MERGE_JIT_AND_ENGINE) +add_definitions(-DFEATURE_MULTICOREJIT) +if (FEATURE_NI_BIND_FALLBACK) + add_definitions(-DFEATURE_NI_BIND_FALLBACK) +endif(FEATURE_NI_BIND_FALLBACK) +if(CLR_CMAKE_PLATFORM_UNIX) + add_definitions(-DFEATURE_PAL) + add_definitions(-DFEATURE_PAL_SXS) + add_definitions(-DFEATURE_PAL_ANSI) +endif(CLR_CMAKE_PLATFORM_UNIX) +if(CLR_CMAKE_PLATFORM_LINUX) + add_definitions(-DFEATURE_PERFMAP) +endif(CLR_CMAKE_PLATFORM_LINUX) +add_definitions(-DFEATURE_PREJIT) + +add_definitions(-DFEATURE_READYTORUN) +set(FEATURE_READYTORUN 1) + +if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) + add_definitions(-DFEATURE_REJIT) +endif(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) + +add_definitions(-DFEATURE_STANDALONE_SN) +add_definitions(-DFEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED) +add_definitions(-DFEATURE_STRONGNAME_MIGRATION) +if (CLR_CMAKE_PLATFORM_UNIX OR CLR_CMAKE_TARGET_ARCH_ARM64) + add_definitions(-DFEATURE_STUBS_AS_IL) +endif () +add_definitions(-DFEATURE_SVR_GC) +add_definitions(-DFEATURE_SYMDIFF) +add_definitions(-DFEATURE_TIERED_COMPILATION) +if (CLR_CMAKE_PLATFORM_ARCH_AMD64) + # Enable the AMD64 Unix struct passing JIT-EE interface for all AMD64 platforms, to enable altjit. + add_definitions(-DFEATURE_UNIX_AMD64_STRUCT_PASSING_ITF) +endif (CLR_CMAKE_PLATFORM_ARCH_AMD64) +if(CLR_CMAKE_PLATFORM_UNIX_AMD64) + add_definitions(-DFEATURE_MULTIREG_RETURN) + add_definitions(-DFEATURE_UNIX_AMD64_STRUCT_PASSING) +endif (CLR_CMAKE_PLATFORM_UNIX_AMD64) +add_definitions(-DFEATURE_USE_ASM_GC_WRITE_BARRIERS) +if(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR (CLR_CMAKE_PLATFORM_ARCH_ARM64 AND NOT WIN32)) + add_definitions(-DFEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP) +endif(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR (CLR_CMAKE_PLATFORM_ARCH_ARM64 AND NOT WIN32)) +if((CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_ARM64) AND NOT WIN32) + add_definitions(-DFEATURE_MANUALLY_MANAGED_CARD_BUNDLES) +endif((CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_ARM64) AND NOT WIN32) + +if(WIN32) + add_definitions(-DFEATURE_VERSIONING_LOG) +endif(WIN32) +if(NOT CLR_CMAKE_PLATFORM_UNIX) + add_definitions(-DFEATURE_WIN32_REGISTRY) +endif(NOT CLR_CMAKE_PLATFORM_UNIX) +add_definitions(-DFEATURE_LEGACYNETCF_DBG_HOST_CONTROL) +add_definitions(-DFEATURE_WINDOWSPHONE) +add_definitions(-DFEATURE_WINMD_RESILIENT) +add_definitions(-D_SECURE_SCL=0) +add_definitions(-DUNICODE) +add_definitions(-D_UNICODE) diff --git a/compileoptions.cmake b/compileoptions.cmake index d872275..0ac4942 100644 --- a/compileoptions.cmake +++ b/compileoptions.cmake @@ -1,46 +1,61 @@ -# Disable frame pointer optimizations so profilers can get better call stacks -add_compile_options(-fno-omit-frame-pointer) - -# The -fms-extensions enable the stuff like __if_exists, __declspec(uuid()), etc. -add_compile_options(-fms-extensions ) -#-fms-compatibility Enable full Microsoft Visual C++ compatibility -#-fms-extensions Accept some non-standard constructs supported by the Microsoft compiler - -# Make signed arithmetic overflow of addition, subtraction, and multiplication wrap around -# using twos-complement representation (this is normally undefined according to the C++ spec). -add_compile_options(-fwrapv) - -add_definitions(-DDISABLE_CONTRACTS) -# The -ferror-limit is helpful during the porting, it makes sure the compiler doesn't stop -# after hitting just about 20 errors. -add_compile_options(-ferror-limit=4096) - -# All warnings that are not explicitly disabled are reported as errors -add_compile_options(-Werror) - -# Disabled warnings -add_compile_options(-Wno-unused-private-field) -add_compile_options(-Wno-unused-variable) -# Explicit constructor calls are not supported by clang (this->ClassName::ClassName()) -add_compile_options(-Wno-microsoft) -# This warning is caused by comparing 'this' to NULL -add_compile_options(-Wno-tautological-compare) -# There are constants of type BOOL used in a condition. But BOOL is defined as int -# and so the compiler thinks that there is a mistake. -add_compile_options(-Wno-constant-logical-operand) - -add_compile_options(-Wno-unknown-warning-option) - -#These seem to indicate real issues -add_compile_options(-Wno-invalid-offsetof) -# The following warning indicates that an attribute __attribute__((__ms_struct__)) was applied -# to a struct or a class that has virtual members or a base class. In that case, clang -# may not generate the same object layout as MSVC. -add_compile_options(-Wno-incompatible-ms-struct) - -# Some architectures (e.g., ARM) assume char type is unsigned while CoreCLR assumes char is signed -# as x64 does. It has been causing issues in ARM (https://github.com/dotnet/coreclr/issues/4746) -add_compile_options(-fsigned-char) +if (CLR_CMAKE_PLATFORM_UNIX) + # Disable frame pointer optimizations so profilers can get better call stacks + add_compile_options(-fno-omit-frame-pointer) + + # The -fms-extensions enable the stuff like __if_exists, __declspec(uuid()), etc. + add_compile_options(-fms-extensions ) + #-fms-compatibility Enable full Microsoft Visual C++ compatibility + #-fms-extensions Accept some non-standard constructs supported by the Microsoft compiler + + # Make signed arithmetic overflow of addition, subtraction, and multiplication wrap around + # using twos-complement representation (this is normally undefined according to the C++ spec). + add_compile_options(-fwrapv) + + if(CLR_CMAKE_PLATFORM_DARWIN) + # We cannot enable "stack-protector-strong" on OS X due to a bug in clang compiler (current version 7.0.2) + add_compile_options(-fstack-protector) + else() + add_compile_options(-fstack-protector-strong) + endif(CLR_CMAKE_PLATFORM_DARWIN) + + add_definitions(-DDISABLE_CONTRACTS) + # The -ferror-limit is helpful during the porting, it makes sure the compiler doesn't stop + # after hitting just about 20 errors. + add_compile_options(-ferror-limit=4096) + + if (CLR_CMAKE_WARNINGS_ARE_ERRORS) + # All warnings that are not explicitly disabled are reported as errors + add_compile_options(-Werror) + endif(CLR_CMAKE_WARNINGS_ARE_ERRORS) + + # Disabled warnings + add_compile_options(-Wno-unused-private-field) + add_compile_options(-Wno-unused-variable) + # Explicit constructor calls are not supported by clang (this->ClassName::ClassName()) + add_compile_options(-Wno-microsoft) + # This warning is caused by comparing 'this' to NULL + add_compile_options(-Wno-tautological-compare) + # There are constants of type BOOL used in a condition. But BOOL is defined as int + # and so the compiler thinks that there is a mistake. + add_compile_options(-Wno-constant-logical-operand) + # We use pshpack1/2/4/8.h and poppack.h headers to set and restore packing. However + # clang 6.0 complains when the packing change lifetime is not contained within + # a header file. + add_compile_options(-Wno-pragma-pack) + + add_compile_options(-Wno-unknown-warning-option) + + #These seem to indicate real issues + add_compile_options(-Wno-invalid-offsetof) + # The following warning indicates that an attribute __attribute__((__ms_struct__)) was applied + # to a struct or a class that has virtual members or a base class. In that case, clang + # may not generate the same object layout as MSVC. + add_compile_options(-Wno-incompatible-ms-struct) + + # Some architectures (e.g., ARM) assume char type is unsigned while CoreCLR assumes char is signed + # as x64 does. It has been causing issues in ARM (https://github.com/dotnet/coreclr/issues/4746) + add_compile_options(-fsigned-char) +endif(CLR_CMAKE_PLATFORM_UNIX) if(CLR_CMAKE_PLATFORM_UNIX_ARM) # Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang @@ -50,8 +65,17 @@ if(CLR_CMAKE_PLATFORM_UNIX_ARM) if(ARM_SOFTFP) add_definitions(-DARM_SOFTFP) add_compile_options(-mfloat-abi=softfp) - add_compile_options(-target armv7-linux-gnueabi) + if(CLR_CMAKE_TARGET_TIZEN_LINUX) + add_compile_options(-target armv7l-tizen-linux-gnueabi) + else() + add_compile_options(-target armv7-linux-gnueabi) + endif() else() - add_compile_options(-target armv7-linux-gnueabihf) + if(CLR_CMAKE_TARGET_TIZEN_LINUX) + add_compile_options(-mfloat-abi=hard) + add_compile_options(-target armv7hl-tizen-linux-gnueabihf) + else() + add_compile_options(-target armv7-linux-gnueabihf) + endif() endif(ARM_SOFTFP) endif(CLR_CMAKE_PLATFORM_UNIX_ARM) diff --git a/functions.cmake b/functions.cmake new file mode 100644 index 0000000..3909f6b --- /dev/null +++ b/functions.cmake @@ -0,0 +1,9 @@ +function(clr_unknown_arch) + if (WIN32) + message(FATAL_ERROR "Only AMD64, ARM64, ARM and I386 are supported") + elseif(CLR_CROSS_COMPONENTS_BUILD) + message(FATAL_ERROR "Only AMD64, I386 host are supported for linux cross-architecture component") + else() + message(FATAL_ERROR "Only AMD64, ARM64, ARM and I386 are supported") + endif() +endfunction() diff --git a/packaging/coreprofiler.spec b/packaging/coreprofiler.spec index 65a6193..31a3e67 100644 --- a/packaging/coreprofiler.spec +++ b/packaging/coreprofiler.spec @@ -1,13 +1,15 @@ %{!?buildtype: %define buildtype Release} Name: coreprofiler -Summary: PUT SUMMARY HERE +Summary: Managed code profiler for CoreCLR Version: 1.0.0 Release: 1 Group: Development/Toolchain License: MIT -Source0: coreprofiler.tar.gz -Source1001: coreprofiler.manifest +Source0: %{name}-%{version}.tar.gz +Source1000: coreprofiler.manifest + +ExcludeArch: aarch64 BuildRequires: cmake BuildRequires: clang >= 3.8 @@ -18,85 +20,54 @@ BuildRequires: lldb >= 3.8 BuildRequires: lldb-devel >= 3.8 BuildRequires: libstdc++-devel BuildRequires: coreclr-devel +# No matter what tizen-release package you use in any profile +AutoReq: 0 Requires: coreclr - - # .NET Core Runtime %define dotnet_version 2.0.0 %define dotnetdir dotnet %define netshareddir %{dotnetdir}/shared %define netcoreappdir %{netshareddir}/Microsoft.NETCore.App/%{dotnet_version} -%ifarch x86_64 -%define ARCH AMD64 -%endif - -%ifarch armv7l -%define ARCH ARM -%endif - -%ifarch %{ix86} -%define ARCH I386 -%endif - -%ifarch aarch64 -%define ARCH ARM64 -%endif - %description This is a CoreCLR profiler for Tizen. %prep -gzip -dc %{SOURCE0} | tar -xvf - -cd coreprofiler -cp %{SOURCE1001} .. +%setup -q +cp %{SOURCE1000} . + %build -%ifarch %{arm} -export CFLAGS=" --target=%{_host} -Wno-deprecated-declarations" -export CXXFLAGS=" --target=%{_host} -Wno-deprecated-declarations" -export ASMFLAGS=" --target=%{_host}" -%else -export GCC_INSTALL_DIR=$(gcc -print-search-dirs | sed -ne '/install: /s/install: //p') -export LLVM_LIBDIR=$(llvm-config --libdir) -export LLVM_INCLUDEDIR=$(llvm-config --includedir) -export GPP_INCLUDE_PATHS=$(cpp -xc++ -v < /dev/null 2>&1 | \ - awk '/search starts here:/{flag=1;next}/End of search list/{flag=0}flag' | \ - sed -e "s/^ //" | tr '\n' ':' | sed -e 's/.$//') -export CLANG_INCLUDE_PATHS=$(clang++ -E -xc++ - -v < /dev/null 2>&1 | \ - awk '/search starts here:/{flag=1;next}/End of search list/{flag=0}flag' | \ - sed -e "s/^ //" | tr '\n' ':' | sed -e 's/.$//') -export CLANG_HEADERS=$(clang++ -print-search-dirs 2>&1 | sed -ne '/libraries: /s/libraries: =//p' | sed -ne 's|:.*|/include|p') +export CFLAGS="--target=%{_host}" +export CXXFLAGS="--target=%{_host}" -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${LLVM_LIBDIR}:${GCC_INSTALL_DIR} -export LIBRARY_PATH=$LIBRARY_PATH:${LLVM_LIBDIR}:${GCC_INSTALL_DIR} -export CFLAGS=" -B${LLVM_LIBDIR} -B${GCC_INSTALL_DIR} -Wno-deprecated-declarations" -export CPPFLAGS=" -B${LLVM_LIBDIR} -B${GCC_INSTALL_DIR} -Wno-deprecated-declarations" -export CXXFLAGS=" -B${LLVM_LIBDIR} -B${GCC_INSTALL_DIR} -Wno-deprecated-declarations" -export CPLUS_INCLUDE_PATH="${LLVM_INCLUDEDIR}/llvm/:${LLVM_INCLUDEDIR}/llvm-c/:${CLANG_HEADERS}:${GPP_INCLUDE_PATHS}:${CLANG_INCLUDE_PATHS}" -export C_INCLUDE_PATH="${LLVM_INCLUDEDIR}/llvm-c/:%{_includedir}" +%ifarch %{ix86} +export CFLAGS=$(echo $CFLAGS | sed -e 's/--target=i686/--target=i586/') +export CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/--target=i686/--target=i586/') +%endif +%ifarch armv7l +%define _cmake_arch_args -DARM_SOFTFP=1 %endif mkdir build cd build -cmake ../coreprofiler \ - -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ - -DCLR_BIN_DIR=%{_datarootdir}/%{netcoreappdir} \ - -DCLR_SRC_DIR=%{_datarootdir}/%{netcoreappdir} \ +cmake .. \ -DCMAKE_BUILD_TYPE=%{buildtype} \ - -DCLR_CMAKE_TARGET_ARCH_%{ARCH}=1 + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCLR_SRC_DIR=%{_datarootdir}/%{netcoreappdir} \ + -DCLR_BIN_DIR=%{_datarootdir}/%{netcoreappdir} \ + -DCLR_CMAKE_LINUX_ID=tizen \ + %{?_cmake_arch_args} make %{?jobs:-j%jobs} -# -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -# -DCMAKE_USER_MAKE_RULES_OVERRIDE=../coreprofiler/%{_overridefile} \ %install cd build -%make_install +make install +mkdir -p %{buildroot}%{_datarootdir}/%{netcoreappdir} +cp install/* %{buildroot}%{_datarootdir}/%{netcoreappdir} %files %manifest coreprofiler.manifest -%defattr(-,root,root,-) %{_datarootdir}/%{netcoreappdir}/libcoreprof.so diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0c44b45..dc37601 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,31 +1,16 @@ -add_definitions(-DPAL_STDCPP_COMPAT) - include_directories( BEFORE . config info misc - stacktrace storage sync trace ) -if(CLR_CMAKE_TARGET_ARCH_ARM) - include_directories("${CLR_SRC_DIR}/src/pal/src/include") -endif() - -set(CLR_INCLUDE_DIR - ${CLR_BIN_DIR}/inc - ${CLR_SRC_DIR}/src/pal/inc/rt - ${CLR_SRC_DIR}/src/pal/prebuilt/inc - ${CLR_SRC_DIR}/src/pal/inc - ${CLR_SRC_DIR}/src/inc) - -include_directories(AFTER ${CLR_INCLUDE_DIR}) - -set(PROFILER_SOURCES_COMMON +add_library(coreprof + SHARED classfactory.cpp config/commonconfigconversions.cpp config/environmentconfigprovider.cpp @@ -50,47 +35,17 @@ set(PROFILER_SOURCES_COMMON trace/executiontrace.cpp trace/memorytrace.cpp tracelog.cpp + arch/${ARCH_SOURCES_DIR}/asmhelpers.S + arch/${ARCH_SOURCES_DIR}/archhelpers.cpp ) -if(CLR_CMAKE_TARGET_ARCH_AMD64) - set(PROFILER_SOURCES_ASM - ${ARCH_SOURCES_DIR}/asmhelpers.S - ${ARCH_SOURCES_DIR}/archhelpers.cpp - ) -elseif(CLR_CMAKE_TARGET_ARCH_ARM) - set(PROFILER_SOURCES_ASM - ${ARCH_SOURCES_DIR}/asmhelpers.S - ${ARCH_SOURCES_DIR}/archhelpers.cpp - ) -elseif(CLR_CMAKE_TARGET_ARCH_I386) - set(PROFILER_SOURCES_ASM - ${ARCH_SOURCES_DIR}/asmhelpers.S - ${ARCH_SOURCES_DIR}/archhelpers.cpp - ) -endif() - -add_library(coreprof - SHARED - ${PROFILER_SOURCES_COMMON} - ${PROFILER_SOURCES_ASM} -) - -set(PROFILER_LINK_LIBRARIES - ${CLR_BIN_DIR}/lib/libcorguids.a +target_link_libraries(coreprof + libcorguids # utilcodestaticnohost # gcinfo + # mscorrc_debug + libcoreclrpal + libpalrt ) -if(CLR_CMAKE_PLATFORM_UNIX) - list(APPEND PROFILER_LINK_LIBRARIES - # mscorrc_debug - ${CLR_BIN_DIR}/lib/libcoreclrpal.a - ${CLR_BIN_DIR}/lib/libpalrt.a - ) -endif(CLR_CMAKE_PLATFORM_UNIX) - -target_link_libraries(coreprof - ${PROFILER_LINK_LIBRARIES} -) - -install(TARGETS coreprof DESTINATION ${CLR_BIN_DIR}) +install(TARGETS coreprof DESTINATION .) diff --git a/src/amd64/archhelpers.cpp b/src/amd64/archhelpers.cpp deleted file mode 100644 index 7457c9c..0000000 --- a/src/amd64/archhelpers.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 - -#include -#include -#include - -HRESULT ContextToStackSnapshotContext( - const void *context, CONTEXT *winContext) noexcept -{ - _ASSERTE(context != nullptr && winContext != nullptr); - - *winContext = {CONTEXT_INTEGER}; - const mcontext_t *mc = - &(reinterpret_cast(context))->uc_mcontext; - - { - winContext->Rax = mc->gregs[REG_RAX]; - winContext->Rbx = mc->gregs[REG_RBX]; - winContext->Rcx = mc->gregs[REG_RCX]; - winContext->Rdx = mc->gregs[REG_RDX]; - winContext->Rsi = mc->gregs[REG_RSI]; - winContext->Rdi = mc->gregs[REG_RDI]; - winContext->Rbp = mc->gregs[REG_RBP]; - winContext->Rsp = mc->gregs[REG_RSP]; - winContext->R8 = mc->gregs[REG_R8]; - winContext->R9 = mc->gregs[REG_R9]; - winContext->R10 = mc->gregs[REG_R10]; - winContext->R11 = mc->gregs[REG_R11]; - winContext->R12 = mc->gregs[REG_R12]; - winContext->R13 = mc->gregs[REG_R13]; - winContext->R14 = mc->gregs[REG_R14]; - winContext->R15 = mc->gregs[REG_R15]; - winContext->EFlags = mc->gregs[REG_EFL]; - winContext->Rip = mc->gregs[REG_RIP]; - } - - return S_OK; -} \ No newline at end of file diff --git a/src/amd64/asmhelpers.S b/src/amd64/asmhelpers.S deleted file mode 100644 index 6382cc7..0000000 --- a/src/amd64/asmhelpers.S +++ /dev/null @@ -1,179 +0,0 @@ -.intel_syntax noprefix -#include "unixasmmacros.inc" - -// -// EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY EnterNaked3, _TEXT, NoHandler - push rbp - mov rbp, rsp - push rax - push rbx - push rcx - push rdx - push rsi - push rdi - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 - sub rsp, 16*8 /* xmm0-xmm7 */ - and rsp, (-16) /* must be alligned */ - movdqa [rsp+0x00], xmm0 - movdqa [rsp+0x10], xmm1 - movdqa [rsp+0x20], xmm2 - movdqa [rsp+0x30], xmm3 - movdqa [rsp+0x40], xmm4 - movdqa [rsp+0x50], xmm5 - movdqa [rsp+0x60], xmm6 - movdqa [rsp+0x70], xmm7 - mov rdi, r14 - call EXTERNAL_C_FUNC(EnterStub) - movdqa xmm0, [rsp+0x00] - movdqa xmm1, [rsp+0x10] - movdqa xmm2, [rsp+0x20] - movdqa xmm3, [rsp+0x30] - movdqa xmm4, [rsp+0x40] - movdqa xmm5, [rsp+0x50] - movdqa xmm6, [rsp+0x60] - movdqa xmm7, [rsp+0x70] - lea rsp, [rbp - (14 * 8)] - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx - pop rax - pop rbp - ret -NESTED_END EnterNaked3, _TEXT - -// -// EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler - push rbp - mov rbp, rsp - push rax - push rbx - push rcx - push rdx - push rsi - push rdi - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 - sub rsp, 16*8 /* xmm0-xmm7 */ - and rsp, (-16) /* must be alligned */ - movdqa [rsp+0x00], xmm0 - movdqa [rsp+0x10], xmm1 - movdqa [rsp+0x20], xmm2 - movdqa [rsp+0x30], xmm3 - movdqa [rsp+0x40], xmm4 - movdqa [rsp+0x50], xmm5 - movdqa [rsp+0x60], xmm6 - movdqa [rsp+0x70], xmm7 - - call EXTERNAL_C_FUNC(LeaveStub) - movdqa xmm0, [rsp+0x00] - movdqa xmm1, [rsp+0x10] - movdqa xmm2, [rsp+0x20] - movdqa xmm3, [rsp+0x30] - movdqa xmm4, [rsp+0x40] - movdqa xmm5, [rsp+0x50] - movdqa xmm6, [rsp+0x60] - movdqa xmm7, [rsp+0x70] - lea rsp, [rbp - (14 * 8)] - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx - pop rax - pop rbp - ret -NESTED_END LeaveNaked3, _TEXT - -// -// EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler - push rbp - mov rbp, rsp - push rax - push rbx - push rcx - push rdx - push rsi - push rdi - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 - sub rsp, 16*8 /* xmm0-xmm7 */ - and rsp, (-16) /* must be alligned */ - movdqa [rsp+0x00], xmm0 - movdqa [rsp+0x10], xmm1 - movdqa [rsp+0x20], xmm2 - movdqa [rsp+0x30], xmm3 - movdqa [rsp+0x40], xmm4 - movdqa [rsp+0x50], xmm5 - movdqa [rsp+0x60], xmm6 - movdqa [rsp+0x70], xmm7 - - call EXTERNAL_C_FUNC(TailcallStub) - movdqa xmm0, [rsp+0x00] - movdqa xmm1, [rsp+0x10] - movdqa xmm2, [rsp+0x20] - movdqa xmm3, [rsp+0x30] - movdqa xmm4, [rsp+0x40] - movdqa xmm5, [rsp+0x50] - movdqa xmm6, [rsp+0x60] - movdqa xmm7, [rsp+0x70] - lea rsp, [rbp - (14 * 8)] - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rdi - pop rsi - pop rdx - pop rcx - pop rbx - pop rax - pop rbp - ret -NESTED_END TailcallNaked3, _TEXT diff --git a/src/arch/amd64/archhelpers.cpp b/src/arch/amd64/archhelpers.cpp new file mode 100644 index 0000000..7457c9c --- /dev/null +++ b/src/arch/amd64/archhelpers.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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 + +#include +#include +#include + +HRESULT ContextToStackSnapshotContext( + const void *context, CONTEXT *winContext) noexcept +{ + _ASSERTE(context != nullptr && winContext != nullptr); + + *winContext = {CONTEXT_INTEGER}; + const mcontext_t *mc = + &(reinterpret_cast(context))->uc_mcontext; + + { + winContext->Rax = mc->gregs[REG_RAX]; + winContext->Rbx = mc->gregs[REG_RBX]; + winContext->Rcx = mc->gregs[REG_RCX]; + winContext->Rdx = mc->gregs[REG_RDX]; + winContext->Rsi = mc->gregs[REG_RSI]; + winContext->Rdi = mc->gregs[REG_RDI]; + winContext->Rbp = mc->gregs[REG_RBP]; + winContext->Rsp = mc->gregs[REG_RSP]; + winContext->R8 = mc->gregs[REG_R8]; + winContext->R9 = mc->gregs[REG_R9]; + winContext->R10 = mc->gregs[REG_R10]; + winContext->R11 = mc->gregs[REG_R11]; + winContext->R12 = mc->gregs[REG_R12]; + winContext->R13 = mc->gregs[REG_R13]; + winContext->R14 = mc->gregs[REG_R14]; + winContext->R15 = mc->gregs[REG_R15]; + winContext->EFlags = mc->gregs[REG_EFL]; + winContext->Rip = mc->gregs[REG_RIP]; + } + + return S_OK; +} \ No newline at end of file diff --git a/src/arch/amd64/asmhelpers.S b/src/arch/amd64/asmhelpers.S new file mode 100644 index 0000000..6382cc7 --- /dev/null +++ b/src/arch/amd64/asmhelpers.S @@ -0,0 +1,179 @@ +.intel_syntax noprefix +#include "unixasmmacros.inc" + +// +// EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY EnterNaked3, _TEXT, NoHandler + push rbp + mov rbp, rsp + push rax + push rbx + push rcx + push rdx + push rsi + push rdi + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + sub rsp, 16*8 /* xmm0-xmm7 */ + and rsp, (-16) /* must be alligned */ + movdqa [rsp+0x00], xmm0 + movdqa [rsp+0x10], xmm1 + movdqa [rsp+0x20], xmm2 + movdqa [rsp+0x30], xmm3 + movdqa [rsp+0x40], xmm4 + movdqa [rsp+0x50], xmm5 + movdqa [rsp+0x60], xmm6 + movdqa [rsp+0x70], xmm7 + mov rdi, r14 + call EXTERNAL_C_FUNC(EnterStub) + movdqa xmm0, [rsp+0x00] + movdqa xmm1, [rsp+0x10] + movdqa xmm2, [rsp+0x20] + movdqa xmm3, [rsp+0x30] + movdqa xmm4, [rsp+0x40] + movdqa xmm5, [rsp+0x50] + movdqa xmm6, [rsp+0x60] + movdqa xmm7, [rsp+0x70] + lea rsp, [rbp - (14 * 8)] + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + pop rax + pop rbp + ret +NESTED_END EnterNaked3, _TEXT + +// +// EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler + push rbp + mov rbp, rsp + push rax + push rbx + push rcx + push rdx + push rsi + push rdi + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + sub rsp, 16*8 /* xmm0-xmm7 */ + and rsp, (-16) /* must be alligned */ + movdqa [rsp+0x00], xmm0 + movdqa [rsp+0x10], xmm1 + movdqa [rsp+0x20], xmm2 + movdqa [rsp+0x30], xmm3 + movdqa [rsp+0x40], xmm4 + movdqa [rsp+0x50], xmm5 + movdqa [rsp+0x60], xmm6 + movdqa [rsp+0x70], xmm7 + + call EXTERNAL_C_FUNC(LeaveStub) + movdqa xmm0, [rsp+0x00] + movdqa xmm1, [rsp+0x10] + movdqa xmm2, [rsp+0x20] + movdqa xmm3, [rsp+0x30] + movdqa xmm4, [rsp+0x40] + movdqa xmm5, [rsp+0x50] + movdqa xmm6, [rsp+0x60] + movdqa xmm7, [rsp+0x70] + lea rsp, [rbp - (14 * 8)] + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + pop rax + pop rbp + ret +NESTED_END LeaveNaked3, _TEXT + +// +// EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler + push rbp + mov rbp, rsp + push rax + push rbx + push rcx + push rdx + push rsi + push rdi + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + sub rsp, 16*8 /* xmm0-xmm7 */ + and rsp, (-16) /* must be alligned */ + movdqa [rsp+0x00], xmm0 + movdqa [rsp+0x10], xmm1 + movdqa [rsp+0x20], xmm2 + movdqa [rsp+0x30], xmm3 + movdqa [rsp+0x40], xmm4 + movdqa [rsp+0x50], xmm5 + movdqa [rsp+0x60], xmm6 + movdqa [rsp+0x70], xmm7 + + call EXTERNAL_C_FUNC(TailcallStub) + movdqa xmm0, [rsp+0x00] + movdqa xmm1, [rsp+0x10] + movdqa xmm2, [rsp+0x20] + movdqa xmm3, [rsp+0x30] + movdqa xmm4, [rsp+0x40] + movdqa xmm5, [rsp+0x50] + movdqa xmm6, [rsp+0x60] + movdqa xmm7, [rsp+0x70] + lea rsp, [rbp - (14 * 8)] + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + pop rax + pop rbp + ret +NESTED_END TailcallNaked3, _TEXT diff --git a/src/arch/arm/archhelpers.cpp b/src/arch/arm/archhelpers.cpp new file mode 100644 index 0000000..6f89735 --- /dev/null +++ b/src/arch/arm/archhelpers.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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 + +#include +#include +#include + +HRESULT ContextToStackSnapshotContext( + const void *context, CONTEXT *winContext) noexcept +{ + _ASSERTE(context != nullptr && winContext != nullptr); + + *winContext = {CONTEXT_INTEGER}; + const mcontext_t *mc = + &(reinterpret_cast(context))->uc_mcontext; + + { + winContext->R0 = mc->arm_r0; + winContext->R1 = mc->arm_r1; + winContext->R2 = mc->arm_r2; + winContext->R3 = mc->arm_r3; + winContext->R4 = mc->arm_r4; + winContext->R5 = mc->arm_r5; + winContext->R6 = mc->arm_r6; + winContext->R7 = mc->arm_r7; + winContext->R8 = mc->arm_r8; + winContext->R9 = mc->arm_r9; + winContext->R10 = mc->arm_r10; + winContext->R11 = mc->arm_fp; + winContext->R12 = mc->arm_ip; + winContext->Sp = mc->arm_sp; + winContext->Lr = mc->arm_lr; + winContext->Pc = mc->arm_pc; + } + + return S_OK; +} diff --git a/src/arch/arm/asmhelpers.S b/src/arch/arm/asmhelpers.S new file mode 100644 index 0000000..6dcc892 --- /dev/null +++ b/src/arch/arm/asmhelpers.S @@ -0,0 +1,39 @@ +#include "unixasmmacros.inc" + +.syntax unified +.thumb + +// +// EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY EnterNaked3, _TEXT, NoHandler + push {r0-r7, lr} + .save {r0-r7, lr} + bl C_FUNC(EnterStub) + pop {r0-r7, pc} +NESTED_END EnterNaked3, _TEXT + +// +// EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler + push {r0-r7, lr} + .save {r0-r7, lr} + bl C_FUNC(LeaveStub) + pop {r0-r7, pc} +NESTED_END LeaveNaked3, _TEXT + +// +// EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler + push {r0-r7, lr} + .save {r0-r7, lr} + bl C_FUNC(TailcallStub) + pop {r0-r7, pc} +NESTED_END TailcallNaked3, _TEXT + +NESTED_ENTRY getPrevPC, _TEXT, NoHandler + ldr r0, [r11, #4] + bx lr +NESTED_END getPrevPC, _TEXT diff --git a/src/arch/i386/archhelpers.cpp b/src/arch/i386/archhelpers.cpp new file mode 100644 index 0000000..e853bc0 --- /dev/null +++ b/src/arch/i386/archhelpers.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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 + +#include +#include +#include + +HRESULT ContextToStackSnapshotContext( + const void *context, CONTEXT *winContext) noexcept +{ + _ASSERTE(context != nullptr && winContext != nullptr); + + *winContext = {CONTEXT_INTEGER}; + const mcontext_t *mc = + &(reinterpret_cast(context))->uc_mcontext; + + { + winContext->Eax = mc->gregs[REG_EAX]; + winContext->Ebx = mc->gregs[REG_EBX]; + winContext->Ecx = mc->gregs[REG_ECX]; + winContext->Edx = mc->gregs[REG_EDX]; + winContext->Esi = mc->gregs[REG_ESI]; + winContext->Edi = mc->gregs[REG_EDI]; + winContext->Ebp = mc->gregs[REG_EBP]; + winContext->Esp = mc->gregs[REG_ESP]; + winContext->SegSs = mc->gregs[REG_SS]; + winContext->EFlags = mc->gregs[REG_EFL]; + winContext->Eip = mc->gregs[REG_EIP]; + winContext->SegCs = mc->gregs[REG_CS]; + } + + return S_OK; +} diff --git a/src/arch/i386/asmhelpers.S b/src/arch/i386/asmhelpers.S new file mode 100644 index 0000000..f8248ed --- /dev/null +++ b/src/arch/i386/asmhelpers.S @@ -0,0 +1,74 @@ +.intel_syntax noprefix +#include "unixasmmacros.inc" + +// +// EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY EnterNaked3, _TEXT, NoHandler + PROLOG_BEG + PROLOG_PUSH eax + PROLOG_PUSH ebx + PROLOG_PUSH ecx + PROLOG_PUSH edx + PROLOG_END + + mov ebx, [ebp+0x8] + push ebx + call C_FUNC(EnterStub) + + EPILOG_BEG + EPILOG_POP edx + EPILOG_POP ecx + EPILOG_POP ebx + EPILOG_POP eax + EPILOG_END + ret 4 +NESTED_END EnterNaked3, _TEXT + +// +// EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler + PROLOG_BEG + PROLOG_PUSH eax + PROLOG_PUSH ebx + PROLOG_PUSH ecx + PROLOG_PUSH edx + PROLOG_END + + mov ebx, [ebp+0x8] + push ebx + call C_FUNC(LeaveStub) + + EPILOG_BEG + EPILOG_POP edx + EPILOG_POP ecx + EPILOG_POP ebx + EPILOG_POP eax + EPILOG_END + ret 4 +NESTED_END LeaveNaked3, _TEXT + +// +// EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler + PROLOG_BEG + PROLOG_PUSH eax + PROLOG_PUSH ebx + PROLOG_PUSH ecx + PROLOG_PUSH edx + PROLOG_END + + mov ebx, [ebp+0x8] + push ebx + call C_FUNC(TailcallStub) + + EPILOG_BEG + EPILOG_POP edx + EPILOG_POP ecx + EPILOG_POP ebx + EPILOG_POP eax + EPILOG_END + ret 4 +NESTED_END TailcallNaked3, _TEXT diff --git a/src/arm/archhelpers.cpp b/src/arm/archhelpers.cpp deleted file mode 100644 index 6f89735..0000000 --- a/src/arm/archhelpers.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 - -#include -#include -#include - -HRESULT ContextToStackSnapshotContext( - const void *context, CONTEXT *winContext) noexcept -{ - _ASSERTE(context != nullptr && winContext != nullptr); - - *winContext = {CONTEXT_INTEGER}; - const mcontext_t *mc = - &(reinterpret_cast(context))->uc_mcontext; - - { - winContext->R0 = mc->arm_r0; - winContext->R1 = mc->arm_r1; - winContext->R2 = mc->arm_r2; - winContext->R3 = mc->arm_r3; - winContext->R4 = mc->arm_r4; - winContext->R5 = mc->arm_r5; - winContext->R6 = mc->arm_r6; - winContext->R7 = mc->arm_r7; - winContext->R8 = mc->arm_r8; - winContext->R9 = mc->arm_r9; - winContext->R10 = mc->arm_r10; - winContext->R11 = mc->arm_fp; - winContext->R12 = mc->arm_ip; - winContext->Sp = mc->arm_sp; - winContext->Lr = mc->arm_lr; - winContext->Pc = mc->arm_pc; - } - - return S_OK; -} diff --git a/src/arm/asmhelpers.S b/src/arm/asmhelpers.S deleted file mode 100644 index 6dcc892..0000000 --- a/src/arm/asmhelpers.S +++ /dev/null @@ -1,39 +0,0 @@ -#include "unixasmmacros.inc" - -.syntax unified -.thumb - -// -// EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY EnterNaked3, _TEXT, NoHandler - push {r0-r7, lr} - .save {r0-r7, lr} - bl C_FUNC(EnterStub) - pop {r0-r7, pc} -NESTED_END EnterNaked3, _TEXT - -// -// EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler - push {r0-r7, lr} - .save {r0-r7, lr} - bl C_FUNC(LeaveStub) - pop {r0-r7, pc} -NESTED_END LeaveNaked3, _TEXT - -// -// EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler - push {r0-r7, lr} - .save {r0-r7, lr} - bl C_FUNC(TailcallStub) - pop {r0-r7, pc} -NESTED_END TailcallNaked3, _TEXT - -NESTED_ENTRY getPrevPC, _TEXT, NoHandler - ldr r0, [r11, #4] - bx lr -NESTED_END getPrevPC, _TEXT diff --git a/src/i386/archhelpers.cpp b/src/i386/archhelpers.cpp deleted file mode 100644 index e853bc0..0000000 --- a/src/i386/archhelpers.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved - * - * 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 - -#include -#include -#include - -HRESULT ContextToStackSnapshotContext( - const void *context, CONTEXT *winContext) noexcept -{ - _ASSERTE(context != nullptr && winContext != nullptr); - - *winContext = {CONTEXT_INTEGER}; - const mcontext_t *mc = - &(reinterpret_cast(context))->uc_mcontext; - - { - winContext->Eax = mc->gregs[REG_EAX]; - winContext->Ebx = mc->gregs[REG_EBX]; - winContext->Ecx = mc->gregs[REG_ECX]; - winContext->Edx = mc->gregs[REG_EDX]; - winContext->Esi = mc->gregs[REG_ESI]; - winContext->Edi = mc->gregs[REG_EDI]; - winContext->Ebp = mc->gregs[REG_EBP]; - winContext->Esp = mc->gregs[REG_ESP]; - winContext->SegSs = mc->gregs[REG_SS]; - winContext->EFlags = mc->gregs[REG_EFL]; - winContext->Eip = mc->gregs[REG_EIP]; - winContext->SegCs = mc->gregs[REG_CS]; - } - - return S_OK; -} diff --git a/src/i386/asmhelpers.S b/src/i386/asmhelpers.S deleted file mode 100644 index f8248ed..0000000 --- a/src/i386/asmhelpers.S +++ /dev/null @@ -1,74 +0,0 @@ -.intel_syntax noprefix -#include "unixasmmacros.inc" - -// -// EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY EnterNaked3, _TEXT, NoHandler - PROLOG_BEG - PROLOG_PUSH eax - PROLOG_PUSH ebx - PROLOG_PUSH ecx - PROLOG_PUSH edx - PROLOG_END - - mov ebx, [ebp+0x8] - push ebx - call C_FUNC(EnterStub) - - EPILOG_BEG - EPILOG_POP edx - EPILOG_POP ecx - EPILOG_POP ebx - EPILOG_POP eax - EPILOG_END - ret 4 -NESTED_END EnterNaked3, _TEXT - -// -// EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler - PROLOG_BEG - PROLOG_PUSH eax - PROLOG_PUSH ebx - PROLOG_PUSH ecx - PROLOG_PUSH edx - PROLOG_END - - mov ebx, [ebp+0x8] - push ebx - call C_FUNC(LeaveStub) - - EPILOG_BEG - EPILOG_POP edx - EPILOG_POP ecx - EPILOG_POP ebx - EPILOG_POP eax - EPILOG_END - ret 4 -NESTED_END LeaveNaked3, _TEXT - -// -// EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); -// -NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler - PROLOG_BEG - PROLOG_PUSH eax - PROLOG_PUSH ebx - PROLOG_PUSH ecx - PROLOG_PUSH edx - PROLOG_END - - mov ebx, [ebp+0x8] - push ebx - call C_FUNC(TailcallStub) - - EPILOG_BEG - EPILOG_POP edx - EPILOG_POP ecx - EPILOG_POP ebx - EPILOG_POP eax - EPILOG_END - ret 4 -NESTED_END TailcallNaked3, _TEXT