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