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