1# Copyright (c) 2023-2024 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 20# CC-OFFNXT(bc-40028) false positive 21include(${PANDA_ROOT}/compiler/cmake/target.cmake) 22 23if(ENABLE_COMPILER_COVERAGE) 24 # Set coverage options 25 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") 26endif() 27 28set(SOURCES 29 llvm_ark_interface.cpp 30 llvm_compiler.cpp 31 llvm_irtoc_compiler.cpp 32 llvm_logger.cpp 33 llvm_options.cpp 34 lowering/debug_data_builder.cpp 35 lowering/gc_barriers.cpp 36 lowering/irtoc_function_utils.cpp 37 lowering/llvm_ir_constructor.cpp 38 lowering/wrapped_module.cpp 39 mir_compiler.cpp 40 object_code/ark_aot_linker.cpp 41 object_code/code_info_producer.cpp 42 object_code/created_object_file.cpp 43 object_code/dump.cpp 44 target_machine_builder.cpp 45 transforms/builtins.cpp 46 transforms/gc_utils.cpp 47 transforms/llvm_optimizer.cpp 48 transforms/passes/aarch64_fixup_sdiv.cpp 49 transforms/passes/ark_frame_lowering/frame_builder.cpp 50 transforms/passes/ark_frame_lowering/frame_lowering.cpp 51 transforms/passes/ark_gvn.cpp 52 transforms/passes/ark_inlining.cpp 53 transforms/passes/check_external.cpp 54 transforms/passes/check_tail_calls.cpp 55 transforms/passes/devirt.cpp 56 transforms/passes/expand_atomics.cpp 57 transforms/passes/fixup_poisons.cpp 58 transforms/passes/gc_intrusion.cpp 59 transforms/passes/gc_intrusion_check.cpp 60 transforms/passes/gep_propagation.cpp 61 transforms/passes/infer_flags.cpp 62 transforms/passes/inline_devirt.cpp 63 transforms/passes/inline_ir/cleanup_inline_module.cpp 64 transforms/passes/inline_ir/discard_inline_module.cpp 65 transforms/passes/inline_ir/inline_ir_utils.cpp 66 transforms/passes/inline_ir/mark_always_inline.cpp 67 transforms/passes/inline_ir/mark_inline_module.cpp 68 transforms/passes/inline_ir/patch_return_handler_stack_adjustment.cpp 69 transforms/passes/inline_ir/remove_unused_functions.cpp 70 transforms/passes/insert_safepoints.cpp 71 transforms/passes/intrinsics_lowering.cpp 72 transforms/passes/loop_peeling.cpp 73 transforms/passes/mem_barriers.cpp 74 transforms/passes/panda_runtime_lowering.cpp 75 transforms/passes/propagate_lenarray.cpp 76 transforms/passes/prune_deopt.cpp 77 transforms/runtime_calls.cpp 78 utils.cpp 79) 80 81include(cmake/CommonDefines.cmake) 82 83if (PANDA_LLVM_AOT) 84 list(APPEND SOURCES 85 llvm_aot_compiler.cpp 86 ) 87endif() 88 89set(GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated) 90file(MAKE_DIRECTORY ${GENERATED_DIR}) 91 92set(PIPELINE_CFG ${CMAKE_CURRENT_LIST_DIR}/transforms/pipeline.cfg) 93set(PIPELINE_GEN_INC ${GENERATED_DIR}/pipeline_gen.inc) 94add_custom_command( 95 OUTPUT ${PIPELINE_GEN_INC} 96 COMMAND ruby ${CMAKE_CURRENT_LIST_DIR}/templates/pipeline.rb 97 -d ${PIPELINE_CFG} 98 -o ${PIPELINE_GEN_INC} 99 DEPENDS ${PIPELINE_CFG} 100) 101add_custom_target(llvmbackend_pipeline_gen DEPENDS ${PIPELINE_CFG} ${PIPELINE_GEN_INC}) 102 103set(PIPELINE_IRTOC_CFG ${CMAKE_CURRENT_LIST_DIR}/transforms/pipeline_irtoc.cfg) 104set(PIPELINE_IRTOC_GEN_INC ${GENERATED_DIR}/pipeline_irtoc_gen.inc) 105add_custom_command( 106 OUTPUT ${PIPELINE_IRTOC_GEN_INC} 107 COMMAND ruby ${CMAKE_CURRENT_LIST_DIR}/templates/pipeline.rb 108 -d ${PIPELINE_IRTOC_CFG} 109 -o ${PIPELINE_IRTOC_GEN_INC} 110 -s "_IRTOC" 111 DEPENDS ${PIPELINE_IRTOC_CFG} 112) 113add_custom_target(llvmbackend_pipeline_irtoc_gen DEPENDS ${PIPELINE_IRTOC_CFG} ${PIPELINE_IRTOC_GEN_INC}) 114 115panda_gen(DATA ${CMAKE_CURRENT_LIST_DIR}/transforms/passes/passes.yaml 116 TEMPLATES llvm_passes.inl.erb 117 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 118 DESTINATION ${GENERATED_DIR} 119 API ${CMAKE_CURRENT_LIST_DIR}/templates/llvm_pass.rb 120 TARGET_NAME llvmbackend_passes_gen 121) 122 123set(OPTIONS_GEN_H ${GENERATED_DIR}/llvm_options_gen.h) 124panda_gen_file( 125 DATA ${CMAKE_CURRENT_LIST_DIR}/llvmbackend.yaml 126 TEMPLATE ${PANDA_ROOT}/templates/options/options.h.erb 127 OUTPUTFILE ${OPTIONS_GEN_H} 128 API ${PANDA_ROOT}/templates/common.rb 129) 130add_custom_target(llvmbackend_options_gen DEPENDS ${OPTIONS_GEN_H}) 131 132panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 133 TEMPLATES intrinsics_gen.inl.erb 134 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 135 DESTINATION ${GENERATED_DIR} 136 API ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 137 REQUIRES ${PANDA_ROOT}/libpandabase/utils.rb 138 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 139) 140 141panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 142 TEMPLATES can_compile_intrinsics_gen.inl.erb 143 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 144 DESTINATION ${GENERATED_DIR} 145 API ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 146 REQUIRES ${PANDA_ROOT}/libpandabase/utils.rb 147 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 148 TARGET_NAME can_compile_intrinsics_gen_llvmbackend 149) 150 151panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 152 TEMPLATES intrinsic_names_gen.inl.erb 153 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 154 DESTINATION ${GENERATED_DIR} 155 API ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 156 REQUIRES ${PANDA_ROOT}/libpandabase/utils.rb 157 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 158 TARGET_NAME intrinsic_names_gen_llvmbackend 159) 160 161panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml 162 TEMPLATES intrinsics_llvm_codegen.inl.erb 163 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 164 DESTINATION ${GENERATED_DIR} 165 API ${CMAKE_CURRENT_LIST_DIR}/templates/intrinsics.rb 166 REQUIRES ${PANDA_ROOT}/libpandabase/utils.rb 167 EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml 168 TARGET_NAME intrinsic_llvm_codegen_llvmbackend 169) 170 171panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/entrypoints.yaml 172 TEMPLATES entrypoints_gen.inl.erb 173 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 174 DESTINATION ${GENERATED_DIR} 175 API ${CMAKE_CURRENT_LIST_DIR}/templates/entrypoints.rb 176 EXTRA_DEPENDENCIES entrypoints_yaml_merge 177) 178 179panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/entrypoints.yaml 180 TEMPLATES entrypoints_llvm_ark_interface_gen.inl.erb 181 SOURCE ${CMAKE_CURRENT_LIST_DIR}/templates 182 DESTINATION ${GENERATED_DIR} 183 API ${CMAKE_CURRENT_LIST_DIR}/templates/entrypoints.rb 184 EXTRA_DEPENDENCIES entrypoints_yaml_merge 185 TARGET_NAME entrypoints_llvm_ark_interface_gen_llvmbackend 186) 187 188set(LOGGER_COMPONENTS_GEN_H ${GENERATED_DIR}/llvm_logger_components.inc) 189panda_gen_file( 190 DATA ${CMAKE_CURRENT_LIST_DIR}/llvmbackend.yaml 191 TEMPLATE ${PANDA_ROOT}/templates/logger_components/logger_components.inc.erb 192 OUTPUTFILE ${LOGGER_COMPONENTS_GEN_H} 193 API ${PANDA_ROOT}/templates/common.rb 194) 195add_custom_target(llvmbackend_logger_components_gen DEPENDS ${LOGGER_COMPONENTS_GEN_H}) 196 197panda_add_library(llvmbackend SHARED ${SOURCES}) 198 199add_custom_target(llvmbackend_gen_files COMMENT "Umbrella target for llvmbackend generated files") 200add_dependencies(llvmbackend_gen_files 201 llvmbackend_pipeline_gen 202 llvmbackend_pipeline_irtoc_gen 203 llvmbackend_options_gen 204 llvmbackend_passes_gen 205 entrypoints_gen_llvmbackend 206 intrinsics_gen_llvmbackend 207 can_compile_intrinsics_gen_llvmbackend 208 intrinsic_names_gen_llvmbackend 209 intrinsic_llvm_codegen_llvmbackend 210 entrypoints_llvm_ark_interface_gen_llvmbackend 211 llvmbackend_logger_components_gen 212) 213 214add_dependencies(llvmbackend llvmbackend_gen_files copy-libLLVM.so) 215add_dependencies(panda_gen_files llvmbackend_gen_files) 216 217panda_target_include_directories(llvmbackend SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS}) 218panda_target_include_directories(llvmbackend PRIVATE .) 219 220panda_target_include_directories(llvmbackend 221 PRIVATE ${PANDA_ROOT}/compiler 222 PUBLIC ${GENERATED_DIR} 223) 224 225panda_target_link_libraries(llvmbackend arkcompiler arkbase arkfile aot_builder ${LIB_LLVM}) 226 227if (NOT (PANDA_TARGET_MOBILE)) 228 panda_target_link_libraries(llvmbackend rt) 229endif() 230 231panda_target_compile_options(llvmbackend PUBLIC "-Wno-unused-parameter") 232 233panda_target_compile_definitions(llvmbackend PUBLIC REQUIRED_LLVM_VERSION=${REQUIRED_LLVM_VERSION}) 234 235if (PANDA_LLVM_AOT AND PANDA_TARGET_AMD64 AND PANDA_COMPILER_TARGET_AARCH64 AND PANDA_WITH_TESTS) 236 set(PANDA_LLVM_AOT_TESTS_SOURCES 237 ${PANDA_ROOT}/compiler/tests/unit_test.cpp 238 ${PANDA_ROOT}/compiler/tests/inst_generator.cpp 239 tests/inst_generator_test.cpp 240 ) 241 set(PANDA_LLVM_AOT_TESTS_LIBRARIES arkcompiler arkbase arkassembler arkruntime llvmbackend) 242 243 panda_add_gtest( 244 CONTAINS_MAIN 245 NAME llvm_aot_unit_tests 246 SOURCES 247 ${PANDA_LLVM_AOT_TESTS_SOURCES} 248 LIBRARIES 249 ${PANDA_LLVM_AOT_TESTS_LIBRARIES} 250 SANITIZERS 251 ${PANDA_SANITIZERS_LIST} 252 ) 253 254 panda_target_include_directories(llvm_aot_unit_tests SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS}) 255 panda_target_include_directories(llvm_aot_unit_tests PRIVATE .) 256 panda_target_include_directories(llvm_aot_unit_tests PRIVATE ${PANDA_ROOT}/compiler 257 PUBLIC "$<TARGET_PROPERTY:arkruntime,INTERFACE_INCLUDE_DIRECTORIES>") 258 panda_target_compile_options(llvm_aot_unit_tests PUBLIC "-Wno-unused-parameter") 259endif() 260