Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Merge pull request #1210 from benpye/linux-arm
Browse files Browse the repository at this point in the history
CoreCLR building on ARM
  • Loading branch information
jkotas committed Jul 24, 2015
2 parents acca43b + b4cf525 commit 2cf141d
Show file tree
Hide file tree
Showing 92 changed files with 3,980 additions and 678 deletions.
78 changes: 61 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,18 @@ set(GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/inc)

if(CMAKE_SYSTEM_NAME STREQUAL Linux)
set(CLR_CMAKE_PLATFORM_UNIX 1)
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM 1)
# Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang
# we have to set the triple by adding a compiler argument
add_compile_options(-target armv7-linux-gnueabihf)
add_compile_options(-mthumb)
add_compile_options(-mfpu=vfpv3)
else()
message(FATAL_ERROR "Only AMD64 and ARM supported")
endif()
set(CLR_CMAKE_PLATFORM_LINUX 1)
endif(CMAKE_SYSTEM_NAME STREQUAL Linux)

Expand Down Expand Up @@ -46,6 +57,14 @@ if(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
set(CLR_CMAKE_PLATFORM_NETBSD 1)
endif(CMAKE_SYSTEM_NAME STREQUAL NetBSD)

if(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
set(CLR_CMAKE_PLATFORM_ARCH_ARM 1)
elseif(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
elseif(WIN32)
set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
endif()

if(WIN32)
enable_language(ASM_MASM)
else()
Expand Down Expand Up @@ -370,15 +389,22 @@ if (CLR_CMAKE_PLATFORM_UNIX)

if(IS_64BIT_BUILD)
add_definitions(-DBIT64=1)
add_definitions(-DFEATURE_PAL)
else (IS_64BIT_BUILD)
message(FATAL_ERROR "error: Detected non x86_64 target processor. Not supported!")
endif(IS_64BIT_BUILD)

add_definitions(-DFEATURE_PAL)

if(CLR_CMAKE_PLATFORM_LINUX)
add_definitions(-D__LINUX__=1)
message("Detected Linux x86_64")
add_definitions(-DLINUX64)
if(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
message("Detected Linux x86_64")
add_definitions(-DLINUX64)
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
message("Detected Linux ARM")
add_definitions(-DLINUX32)
else()
message(FATAL_ERROR "Only AMD64 and ARM supported")
endif()

endif(CLR_CMAKE_PLATFORM_LINUX)
if(CLR_CMAKE_PLATFORM_DARWIN)
message("Detected OSX x86_64")
Expand Down Expand Up @@ -407,6 +433,12 @@ if (IS_64BIT_BUILD EQUAL 1)
endif (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
add_definitions(-D_TARGET_AMD64_=1)
add_definitions(-DDBG_TARGET_AMD64)
elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
if (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
add_definitions(-DDBG_TARGET_ARM_UNIX)
endif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
add_definitions(-D_TARGET_ARM_=1)
add_definitions(-DDBG_TARGET_ARM)
else ()
# TODO: Support this
message(FATAL_ERROR "Not Implemented!")
Expand All @@ -428,7 +460,11 @@ add_definitions(-DFEATURE_APPDOMAIN_RESOURCE_MONITORING)
add_definitions(-DFEATURE_ARRAYSTUB_AS_IL)
if (CLR_CMAKE_PLATFORM_UNIX)
add_definitions(-DFEATURE_STUBS_AS_IL)
add_definitions(-DUNIX_AMD64_ABI)
if (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
add_definitions(-DUNIX_AMD64_ABI)
elseif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
add_definitions(-DUNIX_ARM_ABI)
endif()
endif(CLR_CMAKE_PLATFORM_UNIX)
add_definitions(-DFEATURE_ASYNC_IO)
add_definitions(-DFEATURE_BCL_FORMATTING)
Expand Down Expand Up @@ -519,16 +555,20 @@ if(CLR_CMAKE_PLATFORM_UNIX)
add_definitions(-DFEATURE_DBGIPC_TRANSPORT_VM)
endif(CLR_CMAKE_PLATFORM_UNIX)

if (IS_64BIT_BUILD EQUAL 1)
add_definitions(-D_AMD64_)
add_definitions(-D_AMD64_SIMULATOR_)
add_definitions(-D_AMD64_SIMULATOR_PERF_)
add_definitions(-D_AMD64_WORKAROUND_)
add_definitions(-D_WIN64)
add_definitions(-DAMD64)
if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
add_definitions(-D_AMD64_)
add_definitions(-D_AMD64_SIMULATOR_)
add_definitions(-D_AMD64_SIMULATOR_PERF_)
add_definitions(-D_AMD64_WORKAROUND_)
add_definitions(-D_WIN64)
add_definitions(-DAMD64)
elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
add_definitions(-D_ARM_)
add_definitions(-DARM)
add_definitions(-D_WIN32)
else ()
# TODO - Support this
endif (IS_64BIT_BUILD EQUAL 1)
message(FATAL_ERROR "Only AMD64 and ARM supported")
endif ()

add_definitions(-D_SKIP_IF_SIMULATOR_)
add_definitions(-D_SECURE_SCL=0)
Expand All @@ -542,7 +582,11 @@ add_definitions(-D_UNICODE)
if (IS_64BIT_BUILD EQUAL 1)
set(ARCH_SOURCES_DIR amd64)
else ()
set(ARCH_SOURCES_DIR i386)
if (CLR_CMAKE_PLATFORM_ARCH_ARM)
set(ARCH_SOURCES_DIR arm)
else ()
set(ARCH_SOURCES_DIR i386)
endif ()
endif (IS_64BIT_BUILD EQUAL 1)

add_subdirectory(src)
1 change: 1 addition & 0 deletions build.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ set __SkipTestBuild=
if "%1" == "" goto ArgsDone
if /i "%1" == "/?" goto Usage
if /i "%1" == "x64" (set __BuildArch=x64&&shift&goto Arg_Loop)
if /i "%1" == "arm" (set __BuildArch=arm&&shift&goto Arg_Loop)

if /i "%1" == "debug" (set __BuildType=Debug&shift&goto Arg_Loop)
if /i "%1" == "release" (set __BuildType=Release&shift&goto Arg_Loop)
Expand Down
8 changes: 6 additions & 2 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
usage()
{
echo "Usage: $0 [BuildArch] [BuildType] [clean] [verbose] [clangx.y]"
echo "BuildArch can be: x64"
echo "BuildArch can be: x64, ARM"
echo "BuildType can be: Debug, Release"
echo "clean - optional argument to force a clean build."
echo "verbose - optional argument to enable verbose build output."
Expand Down Expand Up @@ -92,7 +92,7 @@ echo "Commencing CoreCLR Repo build"

# Argument types supported by this script:
#
# Build architecture - valid value is: x64.
# Build architecture - valid values are: x64, ARM.
# Build Type - valid values are: Debug, Release
#
# Set the default arguments for build
Expand Down Expand Up @@ -157,6 +157,10 @@ for i in "$@"
__BuildArch=x64
__MSBuildBuildArch=x64
;;
arm)
__BuildArch=arm
__MSBuildBuildArch=arm
;;
debug)
__BuildType=Debug
;;
Expand Down
9 changes: 8 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@ include_directories("strongname/inc")
include_directories("inc/winrt")

include_directories("debug/inc")
include_directories("debug/inc/amd64")
if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
include_directories("debug/inc/amd64")
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
include_directories("debug/inc/arm")
else()
message(FATAL_ERROR "Only ARM and AMD64 is supported")
endif()

include_directories("debug/inc/dump")
include_directories("md/inc")
include_directories("classlibnative/bcltype")
Expand Down
33 changes: 23 additions & 10 deletions src/ToolBox/SOS/Strike/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
add_definitions(-DSOS_TARGET_AMD64=1)
add_definitions(-D_TARGET_WIN64_=1)
add_definitions(-DDBG_TARGET_64BIT)
add_definitions(-DDBG_TARGET_WIN64=1)
if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
add_definitions(-DSOS_TARGET_AMD64=1)
add_definitions(-D_TARGET_WIN64_=1)
add_definitions(-DDBG_TARGET_64BIT)
add_definitions(-DDBG_TARGET_WIN64=1)
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
add_definitions(-DSOS_TARGET_ARM=1)
add_definitions(-D_TARGET_WIN32_=1)
add_definitions(-DDBG_TARGET_32BIT)
add_definitions(-DDBG_TARGET_WIN32=1)
endif()
add_definitions(-DSTRIKE)

remove_definitions(-DUNICODE)
Expand Down Expand Up @@ -38,12 +45,18 @@ if(WIN32)
WatchCmd.cpp
Native.rc
)

set(SOS_SOURCES_AMD64
disasmX86.cpp
)

list(APPEND SOS_SOURCES ${SOS_SOURCES_AMD64})

if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
set(SOS_SOURCES_ARCH
disasmX86.cpp
)
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
set(SOS_SOURCES_ARCH
disasmARM.cpp
)
endif()

list(APPEND SOS_SOURCES ${SOS_SOURCES_ARCH})

add_definitions(-DFX_VER_INTERNALNAME_STR=SOS.dll)

Expand Down
15 changes: 11 additions & 4 deletions src/ToolBox/SOS/lldbplugin/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@ project(sosplugin)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_definitions(-D_TARGET_AMD64_=1)
add_definitions(-DDBG_TARGET_64BIT=1)
add_definitions(-DDBG_TARGET_AMD64=1)
add_definitions(-DDBG_TARGET_WIN64=1)
if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
add_definitions(-D_TARGET_AMD64_=1)
add_definitions(-DDBG_TARGET_64BIT=1)
add_definitions(-DDBG_TARGET_AMD64=1)
add_definitions(-DDBG_TARGET_WIN64=1)
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
add_definitions(-D_TARGET_ARM_=1)
add_definitions(-DDBG_TARGET_32BIT=1)
add_definitions(-DDBG_TARGET_ARM=1)
add_definitions(-DDBG_TARGET_WIN32=1)
endif()

set(ENABLE_LLDBPLUGIN ${CLR_CMAKE_PLATFORM_UNIX} CACHE BOOL "Enable building the SOS plugin for LLDB.")
set(REQUIRE_LLDBPLUGIN ${CLR_CMAKE_PLATFORM_LINUX} CACHE BOOL "Require building the SOS plugin for LLDB.")
Expand Down
21 changes: 21 additions & 0 deletions src/ToolBox/SOS/lldbplugin/debugclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,7 @@ DebugClient::GetThreadContextById(
dtcontext = (DT_CONTEXT*)context;
dtcontext->ContextFlags = contextFlags;

#ifdef DBG_TARGET_AMD64
dtcontext->Rip = frame.GetPC();
dtcontext->Rsp = frame.GetSP();
dtcontext->Rbp = frame.GetFP();
Expand All @@ -875,6 +876,26 @@ DebugClient::GetThreadContextById(
dtcontext->SegEs = GetRegister(frame, "es");
dtcontext->SegFs = GetRegister(frame, "fs");
dtcontext->SegGs = GetRegister(frame, "gs");
#elif DBG_TARGET_ARM
dtcontext->Pc = frame.GetPC();
dtcontext->Sp = frame.GetSP();
dtcontext->Lr = GetRegister(frame, "lr");
dtcontext->Cpsr = GetRegister(frame, "cpsr");

dtcontext->R0 = GetRegister(frame, "r0");
dtcontext->R1 = GetRegister(frame, "r1");
dtcontext->R2 = GetRegister(frame, "r2");
dtcontext->R3 = GetRegister(frame, "r3");
dtcontext->R4 = GetRegister(frame, "r4");
dtcontext->R5 = GetRegister(frame, "r5");
dtcontext->R6 = GetRegister(frame, "r6");
dtcontext->R7 = GetRegister(frame, "r7");
dtcontext->R8 = GetRegister(frame, "r8");
dtcontext->R9 = GetRegister(frame, "r9");
dtcontext->R10 = GetRegister(frame, "r10");
dtcontext->R11 = GetRegister(frame, "r11");
dtcontext->R12 = GetRegister(frame, "r12");
#endif

hr = S_OK;

Expand Down
8 changes: 7 additions & 1 deletion src/binder/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
set(CMAKE_INCLUDE_CURRENT_DIR ON)

include_directories(BEFORE "../vm/amd64")
if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
include_directories(BEFORE "../vm/amd64")
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
include_directories(BEFORE "../vm/arm")
else()
message(FATAL_ERROR "Only ARM and AMD64 is supported")
endif()
include_directories(BEFORE "../vm")
include_directories(BEFORE "inc")

Expand Down
23 changes: 19 additions & 4 deletions src/classlibnative/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
include_directories(BEFORE "../vm")
include_directories("../inc")
include_directories("../vm/amd64") # TODO: use the target cpu
if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
include_directories(BEFORE "../vm/amd64")
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
include_directories(BEFORE "../vm/arm")
else()
message(FATAL_ERROR "Only ARM and AMD64 is supported")
endif()
include_directories("../debug/inc")
include_directories("../debug/inc/dump")

#TODO for x86
add_definitions(-DDBG_TARGET_64BIT=1)
add_definitions(-DDBG_TARGET_AMD64=1)
add_definitions(-DDBG_TARGET_WIN64=1)

if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
add_definitions(-DDBG_TARGET_64BIT=1)
add_definitions(-DDBG_TARGET_AMD64=1)
add_definitions(-DDBG_TARGET_WIN64=1)
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
add_definitions(-DDBG_TARGET_32BIT=1)
add_definitions(-DDBG_TARGET_ARM=1)
add_definitions(-DDBG_TARGET_WIN32=1)
else()
message(FATAL_ERROR "Only ARM and AMD64 is supported")
endif()

add_subdirectory(bcltype)
add_subdirectory(float)
Expand Down
35 changes: 27 additions & 8 deletions src/debug/daccess/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,22 @@
include(${CLR_DIR}/dac.cmake)

add_definitions(-DFEATURE_NO_HOST)
add_definitions(-D_TARGET_AMD64_=1)
add_definitions(-DDBG_TARGET_64BIT=1)
add_definitions(-DDBG_TARGET_AMD64=1)
add_definitions(-DDBG_TARGET_WIN64=1)
add_definitions(-D_WIN64=1)

if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
add_definitions(-D_TARGET_AMD64_=1)
add_definitions(-DDBG_TARGET_64BIT=1)
add_definitions(-DDBG_TARGET_AMD64=1)
add_definitions(-DDBG_TARGET_WIN64=1)
add_definitions(-D_WIN64=1)
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
add_definitions(-D_TARGET_ARM_=1)
add_definitions(-DDBG_TARGET_32BIT=1)
add_definitions(-DDBG_TARGET_ARM=1)
add_definitions(-DDBG_TARGET_WIN32=1)
add_definitions(-D_WIN32=1)
else()
message(FATAL_ERROR "Only ARM and AMD64 is supported")
endif()

include_directories(BEFORE ${VM_DIR})
include_directories(BEFORE ${VM_DIR}/${ARCH_SOURCES_DIR})
Expand Down Expand Up @@ -38,17 +49,25 @@ set(DACCESS_SOURCES
datatargetadapter.cpp
)

if(IS_64BIT_BUILD EQUAL 1)
if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
include_directories(amd64)

list(APPEND DACCESS_SOURCES
amd64/primitives.cpp
)
else()
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
include_directories(arm)

list(APPEND DACCESS_SOURCES
arm/primitives.cpp
)
elseif(CLR_CMAKE_PLATFORM_ARCH_I386)
include_directories(i386)

list(APPEND DACCESS_SOURCES
i386/primitives.cpp
)
endif(IS_64BIT_BUILD EQUAL 1)
endif()

convert_to_absolute_path(DACCESS_SOURCES ${DACCESS_SOURCES})

Expand Down
2 changes: 2 additions & 0 deletions src/debug/daccess/daccess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5496,6 +5496,8 @@ ClrDataAccess::Initialize(void)
CorDebugPlatform hostPlatform = CORDB_PLATFORM_POSIX_X86;
#elif defined(DBG_TARGET_AMD64)
CorDebugPlatform hostPlatform = CORDB_PLATFORM_POSIX_AMD64;
#elif defined(DBG_TARGET_ARM)
CorDebugPlatform hostPlatform = CORDB_PLATFORM_POSIX_ARM;
#else
#error Unknown Processor.
#endif
Expand Down
Loading

0 comments on commit 2cf141d

Please sign in to comment.