This is an automated email from the ASF dual-hosted git repository.
zhaowu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 7b43db1 [Hexagon] Reenable compilation of TVM runtime for Hexagon
(#7784)
7b43db1 is described below
commit 7b43db1bb83855d53bb8588be1df0fcbdc0a610a
Author: Krzysztof Parzyszek <[email protected]>
AuthorDate: Thu Apr 1 21:47:19 2021 -0500
[Hexagon] Reenable compilation of TVM runtime for Hexagon (#7784)
- Add support for Hexagon SDK 4.x (different directory structure)
- Conditionally disable functions not present on Hexagon (popen, etc.)
- Bump sim_dev architecture target to v65 (older versions can still be
used with older compilers).
Co-authored-by: Ravishankar Kolachana <[email protected]>
Co-authored-by: Ravishankar Kolachana <[email protected]>
---
CMakeLists.txt | 6 ----
cmake/modules/Hexagon.cmake | 48 ++++++++++++++++++++++++---
src/runtime/hexagon/sim/driver/CMakeLists.txt | 2 +-
src/support/utils.h | 14 +++++++-
4 files changed, 58 insertions(+), 12 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 277fe4a..8279687 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -449,12 +449,6 @@ if(BUILD_FOR_HEXAGON)
# Wrap pthread_create to allow setting custom stack size.
set_property(TARGET tvm_runtime APPEND PROPERTY LINK_FLAGS
"-Wl,--wrap=pthread_create")
-
- target_include_directories(tvm_runtime SYSTEM
- PUBLIC "${USE_HEXAGON_SDK}/libs/common/qurt/ADSPv62MP/include/posix"
- PUBLIC "${USE_HEXAGON_SDK}/libs/common/qurt/ADSPv62MP/include/qurt"
- PUBLIC "${USE_HEXAGON_SDK}/incs"
- PUBLIC "${USE_HEXAGON_SDK}/incs/stddef")
endif()
if(USE_THREADS AND NOT BUILD_FOR_HEXAGON)
diff --git a/cmake/modules/Hexagon.cmake b/cmake/modules/Hexagon.cmake
index 9fc806c..80df76b 100644
--- a/cmake/modules/Hexagon.cmake
+++ b/cmake/modules/Hexagon.cmake
@@ -21,8 +21,14 @@ set(PICK_SIM "sim")
set(PICK_HW "target")
set(PICK_NONE "OFF")
+set(FOUND_HEXAGON_SDK_ROOT FALSE)
+set(FOUND_HEXAGON_TOOLCHAIN FALSE)
+
function(find_hexagon_toolchain)
- if (NOT "${USE_HEXAGON_TOOLCHAIN}" STREQUAL "")
+ if(FOUND_HEXAGON_TOOLCHAIN)
+ return()
+ endif()
+ if(NOT "${USE_HEXAGON_TOOLCHAIN}" STREQUAL "")
set(TRY_PATH "${USE_HEXAGON_TOOLCHAIN}")
else()
set(TRY_PATH "${USE_HEXAGON_SDK}")
@@ -35,12 +41,16 @@ function(find_hexagon_toolchain)
get_filename_component(HEXAGON_TMP1 "${HEXAGON_TMP0}" DIRECTORY)
set(HEXAGON_TOOLCHAIN "${HEXAGON_TMP1}" CACHE PATH
"Path to the Hexagon toolchain")
+ set(FOUND_HEXAGON_TOOLCHAIN TRUE)
else(HEXAGON_CLANG)
message(SEND_ERROR "Cannot find Hexagon toolchain in ${TRY_PATH}")
endif()
endfunction()
function(find_hexagon_sdk_root)
+ if(FOUND_HEXAGON_SDK_ROOT)
+ return()
+ endif()
message(STATUS "Checking Hexagon SDK root: ${USE_HEXAGON_SDK}")
file(GLOB_RECURSE HEXAGON_AEESTDDEF "${USE_HEXAGON_SDK}/*/AEEStdDef.h")
if(HEXAGON_AEESTDDEF)
@@ -50,11 +60,30 @@ function(find_hexagon_sdk_root)
get_filename_component(HEXAGON_TMP2 "${HEXAGON_TMP1}" DIRECTORY)
set(HEXAGON_SDK_ROOT "${HEXAGON_TMP2}" CACHE PATH
"Root directory of Hexagon SDK")
+ set(FOUND_HEXAGON_SDK_ROOT TRUE)
else(HEXAGON_AEESTDDEF)
message(SEND_ERROR "Cannot validate Hexagon SDK in ${USE_HEXAGON_SDK}")
endif()
endfunction()
+if(BUILD_FOR_HEXAGON)
+ find_hexagon_sdk_root()
+ if(HEXAGON_SDK_ROOT MATCHES "3.5.1")
+ message(SEND_ERROR "Hexagon SDK 3.5.1 is not supported")
+ elseif(HEXAGON_SDK_ROOT MATCHES "3\.[0-9]+\.[0-9]+")
+ include_directories(
+ SYSTEM "${USE_HEXAGON_SDK}/libs/common/qurt/ADSPv62MP/include/posix"
+ SYSTEM "${USE_HEXAGON_SDK}/libs/common/qurt/ADSPv62MP/include/qurt")
+ else()
+ include_directories(
+ SYSTEM "${HEXAGON_SDK_ROOT}/rtos/qurt/computev65/include/posix"
+ SYSTEM "${HEXAGON_SDK_ROOT}/rtos/qurt/computev65/include/qurt")
+ endif()
+ include_directories(
+ SYSTEM "${HEXAGON_SDK_ROOT}/incs"
+ SYSTEM "${HEXAGON_SDK_ROOT}/incs/stddef")
+endif()
+
if(USE_HEXAGON_DEVICE STREQUAL "OFF")
list(APPEND COMPILER_SRCS src/target/opt/build_hexagon_off.cc)
return()
@@ -67,7 +96,7 @@ elseif(NOT USE_HEXAGON_DEVICE STREQUAL "${PICK_SIM}" AND
endif()
# If USE_HEXAGON_DEVICE is set to a valid value, make sure that USE_HEXAGON_SDK
# is defined.
-if (NOT USE_HEXAGON_SDK)
+if(NOT USE_HEXAGON_SDK)
message(SEND_ERROR "Please set USE_HEXAGON_SDK to the Hexagon SDK root")
return()
endif()
@@ -90,11 +119,22 @@ elseif(USE_HEXAGON_DEVICE STREQUAL "${PICK_HW}")
find_hexagon_sdk_root()
find_hexagon_toolchain()
message(STATUS "Hexagon SDK: ${HEXAGON_SDK_ROOT}")
+ if(HEXAGON_SDK_ROOT MATCHES "3.5.1")
+ message(SEND_ERROR "Hexagon SDK 3.5.1 is not supported")
+ elseif(HEXAGON_SDK_ROOT MATCHES "3\.[0-9]+\.[0-9]+")
+ set(RPCMEM_DIR "libs/common/rpcmem")
+ set(REMOTE_DIR "libs/common/remote/ship/android_Release_aarch64")
+ else()
+ set(RPCMEM_DIR "ipc/fastrpc/rpcmem")
+ set(REMOTE_DIR "ipc/fastrpc/remote/ship/android_aarch64")
+ endif()
file(GLOB RUNTIME_HEXAGON_DEVICE_SRCS src/runtime/hexagon/target/*.cc)
include_directories(SYSTEM "${HEXAGON_SDK_ROOT}/incs/stddef")
- include_directories(SYSTEM "${HEXAGON_SDK_ROOT}/libs/common/rpcmem/inc")
+ include_directories(SYSTEM "${HEXAGON_SDK_ROOT}/${RPCMEM_DIR}/inc")
+ include_directories(
+ SYSTEM "${HEXAGON_SDK_ROOT}/incs")
include_directories(
- SYSTEM
"${HEXAGON_SDK_ROOT}/libs/common/remote/ship/android_Release_aarch64")
+ SYSTEM "${HEXAGON_SDK_ROOT}/${REMOTE_DIR}")
include_directories(SYSTEM "${HEXAGON_TOOLCHAIN}/include/iss")
list(APPEND TVM_RUNTIME_LINKER_LIBS "dl")
if(BUILD_FOR_ANDROID)
diff --git a/src/runtime/hexagon/sim/driver/CMakeLists.txt
b/src/runtime/hexagon/sim/driver/CMakeLists.txt
index a98cfe0..bed23c1 100644
--- a/src/runtime/hexagon/sim/driver/CMakeLists.txt
+++ b/src/runtime/hexagon/sim/driver/CMakeLists.txt
@@ -28,7 +28,7 @@ set(EXTRA_CXX_FLAGS
"-O2"
"-Wno-format"
"-mhvx -mhvx-length=128b"
- "-mv60"
+ "-mv65"
"-stdlib=libc++"
)
diff --git a/src/support/utils.h b/src/support/utils.h
index c51b7b9..91b9c13 100644
--- a/src/support/utils.h
+++ b/src/support/utils.h
@@ -27,8 +27,10 @@
#include <stdio.h>
#ifndef _WIN32
#include <sys/types.h>
+#ifndef __hexagon__
#include <sys/wait.h>
-#endif
+#endif // __hexagon__
+#endif // _WIN32
#include <algorithm>
#include <array>
#include <cctype>
@@ -45,6 +47,7 @@ namespace support {
* \param type "r" is for reading or "w" for writing.
* \return normal standard stream
*/
+#ifndef __hexagon__
inline FILE* TVMPOpen(const char* command, const char* type) {
#if defined(_WIN32)
return _popen(command, type);
@@ -52,12 +55,14 @@ inline FILE* TVMPOpen(const char* command, const char*
type) {
return popen(command, type);
#endif
}
+#endif // __hexagon__
/*!
* \brief TVMPClose wrapper of pclose between windows / linux
* \param stream the stream needed to be close.
* \return exit status
*/
+#ifndef __hexagon__
inline int TVMPClose(FILE* stream) {
#if defined(_WIN32)
return _pclose(stream);
@@ -65,12 +70,14 @@ inline int TVMPClose(FILE* stream) {
return pclose(stream);
#endif
}
+#endif // __hexagon__
/*!
* \brief TVMWifexited wrapper of WIFEXITED between windows / linux
* \param status The status field that was filled in by the wait or waitpid
function
* \return the exit code of the child process
*/
+#ifndef __hexagon__
inline int TVMWifexited(int status) {
#if defined(_WIN32)
return (status != 3);
@@ -78,12 +85,14 @@ inline int TVMWifexited(int status) {
return WIFEXITED(status);
#endif
}
+#endif // __hexagon__
/*!
* \brief TVMWexitstatus wrapper of WEXITSTATUS between windows / linux
* \param status The status field that was filled in by the wait or waitpid
function.
* \return the child process exited normally or not
*/
+#ifndef __hexagon__
inline int TVMWexitstatus(int status) {
#if defined(_WIN32)
return status;
@@ -91,6 +100,7 @@ inline int TVMWexitstatus(int status) {
return WEXITSTATUS(status);
#endif
}
+#endif // __hexagon__
/*!
* \brief IsNumber check whether string is a number.
@@ -137,6 +147,7 @@ inline bool EndsWith(std::string const& value, std::string
const& end) {
* \param err_msg The error message if we have
* \return executed output status
*/
+#ifndef __hexagon__
inline int Execute(std::string cmd, std::string* err_msg) {
std::array<char, 128> buffer;
std::string result;
@@ -151,6 +162,7 @@ inline int Execute(std::string cmd, std::string* err_msg) {
}
return 255;
}
+#endif // __hexagon__
/*!
* \brief Combine two hash values into a single one.