1# Copyright (c) 2023 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(llvmbackend) 15 16if (NOT PANDA_BUILD_LLVM_BACKEND) 17 message(FATAL_ERROR "PANDA_BUILD_LLVM_BACKEND must be true") 18endif() 19 20include(${PANDA_ROOT}/compiler/cmake/target.cmake) 21 22if(ENABLE_COMPILER_COVERAGE) 23 # Set coverage options 24 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") 25endif() 26 27set(SOURCES 28 lowering/debug_data_builder.cpp 29 lowering/gc_barriers.cpp 30 lowering/irtoc_function_utils.cpp 31 lowering/llvm_ir_constructor.cpp 32 object_code/created_object_file.cpp 33 transforms/passes/ark_inlining.cpp 34 transforms/passes/expand_atomics.cpp 35 transforms/passes/inline_ir/cleanup_inline_module.cpp 36 transforms/passes/inline_ir/discard_inline_module.cpp 37 transforms/passes/inline_ir/inline_ir_utils.cpp 38 transforms/passes/inline_ir/mark_always_inline.cpp 39 transforms/passes/inline_ir/mark_inline_module.cpp 40 transforms/passes/inline_ir/patch_return_handler_stack_adjustment.cpp 41 transforms/passes/inline_ir/remove_unused_functions.cpp 42 transforms/llvm_optimizer.cpp 43 transforms/runtime_calls.cpp 44 llvm_ark_interface.cpp 45 llvm_compiler.cpp 46 llvm_irtoc_compiler.cpp 47 llvm_logger.cpp 48 llvm_options.cpp 49 mir_compiler.cpp 50 target_machine_builder.cpp 51) 52 53if (PANDA_LLVM_AOT) 54 list(APPEND SOURCES 55 llvm_aot_compiler.cpp 56 ) 57endif() 58 59set(GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated) 60file(MAKE_DIRECTORY ${GENERATED_DIR}) 61 62set(PIPELINE_IRTOC_CFG ${CMAKE_CURRENT_LIST_DIR}/transforms/pipeline_irtoc.cfg) 63set(PIPELINE_IRTOC_GEN_INC ${GENERATED_DIR}/pipeline_irtoc_gen.inc) 64add_custom_command( 65 OUTPUT ${PIPELINE_IRTOC_GEN_INC} 66 COMMAND ruby ${CMAKE_CURRENT_LIST_DIR}/templates/pipeline.rb 67 -d ${PIPELINE_IRTOC_CFG} 68 -o ${PIPELINE_IRTOC_GEN_INC} 69 -s "_IRTOC" 70 DEPENDS ${PIPELINE_IRTOC_CFG} 71) 72add_custom_target(llvmbackend_pipeline_irtoc_gen DEPENDS ${PIPELINE_IRTOC_CFG} ${PIPELINE_IRTOC_GEN_INC}) 73 74panda_gen(DATA ${CMAKE_CURRENT_LIST_DIR}/transforms/passes/passes.yaml 75 TEMPLATES llvm_passes.inl.erb 76 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 77 DESTINATION ${GENERATED_DIR} 78 REQUIRES ${CMAKE_CURRENT_LIST_DIR}/templates/llvm_pass.rb 79 TARGET_NAME llvmbackend_passes_gen 80) 81 82set(OPTIONS_GEN_H ${GENERATED_DIR}/llvm_options_gen.h) 83panda_gen_file( 84 DATAFILE ${CMAKE_CURRENT_LIST_DIR}/llvmbackend.yaml 85 TEMPLATE ${PANDA_ROOT}/templates/options/options.h.erb 86 OUTPUTFILE ${OPTIONS_GEN_H} 87 REQUIRES ${PANDA_ROOT}/templates/common.rb 88) 89add_custom_target(llvmbackend_options_gen DEPENDS ${OPTIONS_GEN_H}) 90 91panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 92 TEMPLATES intrinsics_gen.inl.erb 93 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 94 DESTINATION ${GENERATED_DIR} 95 REQUIRES ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 96 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 97) 98 99panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 100 TEMPLATES can_compile_intrinsics_gen.inl.erb 101 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 102 DESTINATION ${GENERATED_DIR} 103 REQUIRES ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 104 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 105 TARGET_NAME can_compile_intrinsics_gen_llvmbackend 106) 107 108panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 109 TEMPLATES intrinsic_names_gen.inl.erb 110 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 111 DESTINATION ${GENERATED_DIR} 112 REQUIRES ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 113 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 114 TARGET_NAME intrinsic_names_gen_llvmbackend 115) 116 117panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/entrypoints.yaml 118 TEMPLATES entrypoints_gen.inl.erb 119 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 120 DESTINATION ${GENERATED_DIR} 121 REQUIRES ${CMAKE_CURRENT_LIST_DIR}/templates/entrypoints.rb 122) 123 124panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/entrypoints.yaml 125 TEMPLATES entrypoints_llvm_ark_interface_gen.inl.erb 126 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 127 DESTINATION ${GENERATED_DIR} 128 REQUIRES ${CMAKE_CURRENT_LIST_DIR}/templates/entrypoints.rb 129 TARGET_NAME entrypoints_llvm_ark_interface_gen_llvmbackend 130) 131 132set(LOGGER_COMPONENTS_GEN_H ${GENERATED_DIR}/llvm_logger_components.inc) 133panda_gen_file( 134 DATAFILE ${CMAKE_CURRENT_LIST_DIR}/llvmbackend.yaml 135 TEMPLATE ${PANDA_ROOT}/templates/logger_components/logger_components.inc.erb 136 OUTPUTFILE ${LOGGER_COMPONENTS_GEN_H} 137 REQUIRES ${PANDA_ROOT}/templates/common.rb 138) 139add_custom_target(llvmbackend_logger_components_gen DEPENDS ${LOGGER_COMPONENTS_GEN_H}) 140 141panda_add_library(llvmbackend SHARED ${SOURCES}) 142 143add_custom_target(llvmbackend_gen_files COMMENT "Umbrella target for llvmbackend generated files") 144add_dependencies(llvmbackend_gen_files 145 llvmbackend_pipeline_irtoc_gen 146 llvmbackend_options_gen 147 llvmbackend_passes_gen 148 entrypoints_gen_llvmbackend 149 intrinsics_gen_llvmbackend 150 can_compile_intrinsics_gen_llvmbackend 151 intrinsic_names_gen_llvmbackend 152 entrypoints_llvm_ark_interface_gen_llvmbackend 153 llvmbackend_logger_components_gen 154) 155 156add_dependencies(llvmbackend llvmbackend_gen_files) 157add_dependencies(panda_gen_files llvmbackend_gen_files) 158 159panda_target_include_directories(llvmbackend SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS}) 160panda_target_include_directories(llvmbackend PRIVATE .) 161 162panda_target_include_directories(llvmbackend 163 PRIVATE ${PANDA_ROOT}/compiler 164 PUBLIC ${GENERATED_DIR} 165) 166 167panda_target_link_libraries(llvmbackend arkcompiler arkbase arkfile ${LIB_LLVM}) 168 169if (NOT (PANDA_TARGET_MOBILE)) 170 panda_target_link_libraries(llvmbackend rt) 171endif() 172 173panda_target_compile_options(llvmbackend PUBLIC "-Wno-unused-parameter") 174 175panda_target_compile_definitions(llvmbackend PUBLIC REQUIRED_LLVM_VERSION=15.0.4-ark14) 176