-
Notifications
You must be signed in to change notification settings - Fork 3.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Hexagon] Reuse Hexagon SDK analysis across cmake files #8822
Changes from 1 commit
15c750e
e4132bf
2187d5a
3765132
8137504
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,12 +16,12 @@ | |
# under the License. | ||
|
||
include(ExternalProject) | ||
include(cmake/modules/HexagonSDK.cmake) | ||
|
||
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) | ||
|
@@ -47,41 +47,10 @@ function(find_hexagon_toolchain) | |
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) | ||
# The path is ${HEXAGON_SDK_ROOT}/incs/stddef/AEEStdDef.h. | ||
get_filename_component(HEXAGON_TMP0 "${HEXAGON_AEESTDDEF}" DIRECTORY) | ||
get_filename_component(HEXAGON_TMP1 "${HEXAGON_TMP0}" DIRECTORY) | ||
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") | ||
find_hexagon_sdk_root("${USE_HEXAGON_SDK}" "v66") | ||
# Add SDK and QuRT includes when building for Hexagon. | ||
include_directories(SYSTEM ${HEXAGON_SDK_INCLUDES} ${HEXAGON_QURT_INCLUDES}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you switch this to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that would also require moving the If we're cleaning up the module usage, I'd lean toward having every module define an object library, along with any flags that are needed. It looks like there's a nice new feature in cmake 3.12 that allows object libraries to specify linkage. There are some workarounds for earlier versions, including using static libraries, but needing the I think I'd stick with the current style for consistency with other modules, but I want to change it to use object libraries if/when we require a newer version of cmake. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These targets are created after the target-specific modules are included. In other words, they don't yet exist here. Edit: This is essentially what @Lunderberg said, I didn't see his comment when I was replying. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would like to clean up the module, but I don't want to put too much of a burden on you @kparzysz-quic. If its too much work switch this to @Lunderberg I think cmake 3.9 is the minimum version of cmake we support. There are a lot of useful features in 3.12 and 3.13 that I'd like to use, but many OSs don't have newer version of cmake. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That was my guess, since ubuntu18.04 is on 3.10 in the repo. It would be nice to have a newer version, but not worth dropping support. It looks like the |
||
endif() | ||
|
||
if(USE_HEXAGON_DEVICE STREQUAL "OFF") | ||
|
@@ -116,26 +85,15 @@ if(USE_HEXAGON_DEVICE STREQUAL "${PICK_SIM}") | |
INSTALL_COMMAND "true" | ||
) | ||
elseif(USE_HEXAGON_DEVICE STREQUAL "${PICK_HW}") | ||
find_hexagon_sdk_root() | ||
find_hexagon_sdk_root("${USE_HEXAGON_SDK}" "v66") | ||
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}/${RPCMEM_DIR}/inc") | ||
include_directories( | ||
SYSTEM "${HEXAGON_SDK_ROOT}/incs") | ||
include_directories( | ||
SYSTEM "${HEXAGON_SDK_ROOT}/${REMOTE_DIR}") | ||
include_directories(SYSTEM "${HEXAGON_TOOLCHAIN}/include/iss") | ||
|
||
include_directories(SYSTEM | ||
${HEXAGON_SDK_INCLUDES} | ||
${HEXAGON_RPCMEM_ROOT}/inc | ||
${HEXAGON_REMOTE_ROOT} | ||
) | ||
Comment on lines
+93
to
+97
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you also switch this to |
||
list(APPEND TVM_RUNTIME_LINKER_LIBS "dl") | ||
if(BUILD_FOR_ANDROID) | ||
# Hexagon runtime uses __android_log_print, which is in liblog. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
# Licensed to the Apache Software Foundation (ASF) under one | ||
# or more contributor license agreements. See the NOTICE file | ||
# distributed with this work for additional information | ||
# regarding copyright ownership. The ASF licenses this file | ||
# to you 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. | ||
|
||
set(FOUND_HEXAGON_SDK_ROOT FALSE) | ||
|
||
macro(set_parent var) | ||
set(${var} ${ARGN} PARENT_SCOPE) | ||
endmacro() | ||
|
||
function(find_hexagon_sdk_root HEXAGON_SDK_PATH HEXAGON_ARCH) | ||
if(FOUND_HEXAGON_SDK_ROOT) | ||
return() | ||
endif() | ||
if(${ARGC} LESS "2") | ||
message(SEND_ERROR "Must provide Hexagon SDK path and Hexagon arch") | ||
endif() | ||
|
||
# Initial verification of the Hexagon SDK. | ||
message(STATUS "Checking Hexagon SDK root: ${HEXAGON_SDK_PATH}") | ||
file(GLOB_RECURSE VERSION_HEADERS "${HEXAGON_SDK_PATH}/*/version.h") | ||
if(VERSION_HEADERS) | ||
foreach(HEADER IN LISTS VERSION_HEADERS) | ||
if(HEADER MATCHES "incs/version.h$") | ||
set(SDK_VERSION_HEADER "${HEADER}") | ||
break() | ||
endif() | ||
endforeach() | ||
# The path is ${HEXAGON_SDK_ROOT}/incs/version.h. | ||
get_filename_component(TMP0 "${SDK_VERSION_HEADER}" DIRECTORY) | ||
get_filename_component(TMP1 "${TMP0}" DIRECTORY) | ||
set(HEXAGON_SDK_ROOT "${TMP1}" CACHE PATH "Root directory of Hexagon SDK") | ||
else() | ||
message(SEND_ERROR "Cannot validate Hexagon SDK in ${HEXAGON_SDK_PATH}") | ||
endif() | ||
|
||
execute_process( | ||
COMMAND grep "#define[ \t]*VERSION_STRING" "${SDK_VERSION_HEADER}" | ||
OUTPUT_VARIABLE SDK_VERSION_DEFINE) | ||
string( | ||
REGEX REPLACE ".*VERSION_STRING.* ([0-9\\.]+) .*" "\\1" | ||
SDK_VERSION_STRING "${SDK_VERSION_DEFINE}") | ||
|
||
if (SDK_VERSION_STRING MATCHES "3.5.1") | ||
message(SEND_ERROR "Hexagon SDK 3.5.1 is not supported") | ||
endif() | ||
|
||
# Set the Hexagon arch directory component. | ||
set(HEXARCH_DIR_v60 "ADSPv60MP") | ||
set(HEXARCH_DIR_v62 "ADSPv62MP") | ||
set(HEXARCH_DIR_v65 "computev65") | ||
set(HEXARCH_DIR_v66 "computev66") | ||
set(HEXARCH_DIR_v68 "computev68") | ||
tmoreau89 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
set(HEXARCH_DIR_STR "HEXARCH_DIR_${HEXAGON_ARCH}") | ||
set(HEXARCH_DIR ${${HEXARCH_DIR_STR}}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this supposed to have double There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, this is sort of a "map": first we construct the key The quotes were added. Edit: is -> holds, a -> the |
||
|
||
if(NOT HEXARCH_DIR) | ||
message(SEND_ERROR | ||
"Please set HEXAGON_ARCH to one of v60, v62, v65, v66, v68") | ||
endif() | ||
|
||
# Set parent variables: | ||
# - HEXAGON_SDK_VERSION | ||
# - HEXAGON_SDK_INCLUDES | ||
# - HEXAGON_QURT_INCLUDES | ||
# - HEXAGON_RPCMEM_ROOT | ||
# - HEXAGON_REMOTE_ROOT | ||
# - HEXAGON_QAIC_EXE | ||
set_parent(HEXAGON_SDK_VERSION "${SDK_VERSION_STRING}") | ||
|
||
if(SDK_VERSION_STRING MATCHES "^3\.[0-9]+\.[0-9]+") | ||
# SDK 3.x.y | ||
if(HEXAGON_ARCH MATCHES "v6[7-9]|v[7-9][0-9]") | ||
message(SEND_ERROR | ||
"Hexagon SDK ${SDK_VERSION_STRING} does not support ${HEXAGON_ARCH}") | ||
endif() | ||
set_parent(HEXAGON_SDK_INCLUDES | ||
"${HEXAGON_SDK_ROOT}/incs" | ||
"${HEXAGON_SDK_ROOT}/incs/a1std" | ||
"${HEXAGON_SDK_ROOT}/incs/qlist" | ||
"${HEXAGON_SDK_ROOT}/incs/stddef") | ||
set_parent(HEXAGON_QURT_INCLUDES | ||
"${HEXAGON_SDK_ROOT}/libs/common/qurt/${HEXARCH_DIR}/include/posix" | ||
"${HEXAGON_SDK_ROOT}/libs/common/qurt/${HEXARCH_DIR}/include/qurt") | ||
set_parent(HEXAGON_RPCMEM_ROOT "${HEXAGON_SDK_ROOT}/libs/common/rpcmem") | ||
set_parent(HEXAGON_REMOTE_ROOT | ||
"${HEXAGON_SDK_ROOT}/libs/common/remote/ship/android_Release_aarch64") | ||
set_parent(HEXAGON_QAIC_EXE "${HEXAGON_SDK_ROOT}/tools/qaic/bin/qaic") | ||
else() | ||
# SDK 4.x.y.z | ||
if(HEXAGON_ARCH MATCHES "v6[02]") | ||
message(SEND_ERROR | ||
"Hexagon SDK ${SDK_VERSION_STRING} does not support ${HEXAGON_ARCH}") | ||
endif() | ||
set_parent(HEXAGON_SDK_INCLUDES | ||
"${HEXAGON_SDK_ROOT}/incs" | ||
"${HEXAGON_SDK_ROOT}/incs/stddef") | ||
set_parent(HEXAGON_QURT_INCLUDES | ||
"${HEXAGON_SDK_ROOT}/rtos/qurt/${HEXARCH_DIR}/include/posix" | ||
"${HEXAGON_SDK_ROOT}/rtos/qurt/${HEXARCH_DIR}/include/qurt") | ||
set_parent(HEXAGON_RPCMEM_ROOT "${HEXAGON_SDK_ROOT}/ipc/fastrpc/rpcmem") | ||
set_parent(HEXAGON_REMOTE_ROOT # libadsprpc.so | ||
"${HEXAGON_SDK_ROOT}/ipc/fastrpc/remote/ship/android_aarch64") | ||
set_parent(HEXAGON_QAIC_EXE | ||
"${HEXAGON_SDK_ROOT}/ipc/fastrpc/qaic/Ubuntu16/qaic") | ||
endif() | ||
|
||
set(FOUND_HEXAGON_SDK_ROOT TRUE) | ||
endfunction() | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We are intentionally hard coding to be using v66 ISA here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes... We'd have to add yet another Hexagon-related user variable to the cmake configuration that specifies the Hexagon architecture to make it flexible. Are you concerned about the hard-coding, or about the specific version used?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mainly the hard-coding. Wondering if we can expose this to the top-level config.cmake for instance:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://github.com/apache/tvm/blob/main/cmake/config.cmake#L272-L274
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can add
USE_HEXAGON_ARCH
variable toconfig.cmake
. Should have another patch ready soon.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great, thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.