• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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