Skip to content
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

Merged
merged 5 commits into from
Aug 25, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 11 additions & 53 deletions cmake/modules/Hexagon.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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")
Copy link
Contributor

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?

Copy link
Contributor Author

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?

Copy link
Contributor

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:

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WDYT?

Copy link
Contributor Author

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 to config.cmake. Should have another patch ready soon.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, thanks!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

# Add SDK and QuRT includes when building for Hexagon.
include_directories(SYSTEM ${HEXAGON_SDK_INCLUDES} ${HEXAGON_QURT_INCLUDES})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you switch this to target_include_directories? You may have to call it multiple times with different targets (tvm_objs, tvm). I know the old code used include_directories, but it would be good to clean this up.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that would also require moving the include(cmake/modules/Hexagon.cmake) to be after the definitions of tvm_objs. It would then also require using the target_sources function instead of appending to the RUNTIME_SRCS variable, since the RUNTIME_SRCS variable isn't used after the definition of the object libraries.

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 -Wl,--whole-archive flag is causing some issues.

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.

Copy link
Contributor Author

@kparzysz-quic kparzysz-quic Aug 24, 2021

Choose a reason for hiding this comment

The 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.

Copy link
Contributor

Choose a reason for hiding this comment

The 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 target_include_directories, we can leave it as further work.

@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.

Copy link
Contributor

Choose a reason for hiding this comment

The 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 CMakeLists.txt declares a minimum version of cmake 3.2, while the documentation gives 3.5.

endif()

if(USE_HEXAGON_DEVICE STREQUAL "OFF")
Expand Down Expand Up @@ -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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you also switch this to target_include_directories?

list(APPEND TVM_RUNTIME_LINKER_LIBS "dl")
if(BUILD_FOR_ANDROID)
# Hexagon runtime uses __android_log_print, which is in liblog.
Expand Down
123 changes: 123 additions & 0 deletions cmake/modules/HexagonSDK.cmake
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}})
Copy link
Contributor

@tkonolige tkonolige Aug 24, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this supposed to have double ${? In any case, this should be quoted.

Copy link
Contributor Author

@kparzysz-quic kparzysz-quic Aug 24, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is sort of a "map": first we construct the key HEXAGON_DIR_STR (which holds the name of the variable holding the value), then we check the variable to get the "mapped" value.

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()

Loading