1# Copyright (c) 2021-2022 Huawei Device Co., Ltd. 2# Licensed under the Apache License, Version 2.0 (the "License"); 3# you may not use this file except in compliance with the License. 4# You may obtain a copy of the License at 5# 6# http://www.apache.org/licenses/LICENSE-2.0 7# 8# Unless required by applicable law or agreed to in writing, software 9# distributed under the License is distributed on an "AS IS" BASIS, 10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11# See the License for the specific language governing permissions and 12# limitations under the License. 13 14project(irtoc_backend) 15 16############################################################################### 17# irtoc: library 18# 19set(SOURCES 20 compilation_unit.cpp 21 compiler/codegen_boundary.cpp 22 compiler/codegen_fastpath.cpp 23) 24 25add_library(irtoc SHARED ${SOURCES}) 26 27target_link_libraries(irtoc arkcompiler elfio arkbase) 28 29add_dependencies(irtoc asm_defines_generator cross_values) 30 31set_source_files_properties(compilation_unit.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow) 32 33target_include_directories(irtoc 34 PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options 35 PUBLIC ${PANDA_BINARY_ROOT}/cross_values 36 PUBLIC ${PANDA_BINARY_ROOT}/runtime/include 37 PUBLIC ${PANDA_THIRD_PARTY_SOURCES_DIR}/elfio 38) 39 40# Compile one or more irtoc script files into elf object file. 41# Arguments: 42# TARGET_NAME - name of the target, that will generate object file. Thereby user can make dependency on it. 43# INPUT_FILES - input Irtoc scripts, usually it is files from `irtoc/scripts` folder. 44# TARGET_VARIABLE - name of a variable, which will hold name of the generated object file, so the user can link it to 45# the target's sources. 46function(irtoc_compile) 47 set(noValues) 48 set(singleValueArgs TARGET_NAME TARGET_VARIABLE) 49 set(multiValueArgs INPUT_FILES) 50 cmake_parse_arguments(ARG "${noValues}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) 51 52 set(BUILD_DIR "${IRTOC_BUILD_DIR}/${ARG_TARGET_NAME}") 53 file(MAKE_DIRECTORY ${BUILD_DIR}) 54 55 set(IRTOC_GENERATOR_TARGET irtoc_generate_${ARG_TARGET_NAME}) 56 set(IRTOC_COMPILE_OUTPUT "${BUILD_DIR}/irtoc_code.cpp") 57 irtoc_generate( 58 TARGET ${IRTOC_GENERATOR_TARGET} 59 IR_API ir-constructor 60 INPUT_FILES "${ARG_INPUT_FILES}" 61 OUTPUT_FILE ${IRTOC_COMPILE_OUTPUT} 62 WORKING_DIRECTORY ${BUILD_DIR} 63 ) 64 65 ############################################################################### 66 # Executable 67 # 68 set(SOURCES ${IRTOC_COMPILE_OUTPUT} ${IRTOC_SOURCE_DIR}/backend/irtoc.cpp) 69 70 set(IRTOC_EXEC ${ARG_TARGET_NAME}_exec) 71 72 panda_add_executable(${IRTOC_EXEC} ${SOURCES}) 73 add_dependencies(${IRTOC_EXEC} ${IRTOC_GENERATOR_TARGET}) 74 75 target_link_libraries(${IRTOC_EXEC} irtoc) 76 77 panda_add_sanitizers(TARGET ${IRTOC_EXEC} SANITIZERS ${PANDA_SANITIZERS_LIST}) 78 79 ############################################################################### 80 # final target: run irtoc tool, that will generate resulting object file 81 # 82 set(IRTOC_OUTPUT ${BUILD_DIR}/${ARG_TARGET_NAME}.o) 83 84 # Irtoc validation is enabled only in pure Release build 85 if (CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT IRTOC_WITH_SANITIZERS) 86 set(VALIDATION_COMMAND ruby ${IRTOC_SOURCE_DIR}/lang/validation.rb ${BUILD_DIR}/validation.yaml ${BUILD_DIR}/disasm.txt) 87 endif() 88 89 add_custom_command(OUTPUT ${IRTOC_OUTPUT} 90 COMMENT "Building ${IRTOC_OUTPUT}" 91 COMMAND ${PANDA_RUN_PREFIX} ${IRTOC_EXEC} 92 --irtoc-output ${IRTOC_OUTPUT} 93 --compiler-cross-arch ${IRTOC_TARGET} 94 --compiler-disasm-dump:single-file 95 COMMAND ${VALIDATION_COMMAND} 96 WORKING_DIRECTORY ${BUILD_DIR} 97 DEPENDS ${IRTOC_EXEC} 98 ) 99 100 add_custom_target(${ARG_TARGET_NAME} ALL 101 DEPENDS ${IRTOC_OUTPUT} irtoc_plugins_txt 102 ) 103 add_dependencies(${ARG_TARGET_NAME} ${IRTOC_EXEC}) 104 105 # Set output variable to the generated object file, so caller can link it to target's sources 106 set(${ARG_TARGET_VARIABLE} ${IRTOC_OUTPUT} PARENT_SCOPE) 107endfunction() 108 109############################################################################### 110# Other stuff 111# 112panda_gen_options(TARGET irtoc YAML_FILE options.yaml GENERATED_HEADER irtoc_options_gen.h) 113 114panda_add_sanitizers(TARGET irtoc SANITIZERS ${PANDA_SANITIZERS_LIST}) 115 116add_check_style(".") 117panda_add_to_clang_tidy(TARGET irtoc) 118