# Copyright (c) 2023-2024 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import("//arkcompiler/runtime_core/static_core/ark_config.gni") import("//build/ohos.gni") if (is_llvmbackend) { assert(target_cpu == "amd64" || target_cpu == "arm64" || target_cpu == "x64" || target_cpu == "x86_64") ### LLVM import("llvm.gni") if (current_toolchain == host_toolchain && target_cpu == "arm64") { llvm_dir = llvm_host_dir } else { llvm_dir = llvm_target_dir } llvm_include_dir = "$llvm_dir/include" llvm_lib_file = "$llvm_dir/$llvm_lib_file_suffix" copy("llvm_lib") { sources = [ "$llvm_lib_file" ] basename = get_path_info("$llvm_lib_file", "file") if (ark_static_standalone_build) { outputs = [ "$root_out_dir/lib/$basename" ] } else { outputs = [ "$root_out_dir/$ark_subsystem_name/$ark_part_name/$basename" ] } } ### LLVM Backend config("libllvmbackend_public_config") { include_dirs = [ "$ark_root/libllvmbackend", "$target_gen_dir", llvm_include_dir, ] libs = get_target_outputs(":llvm_lib") } libllvmbackend_sources = [ "llvm_ark_interface.cpp", "llvm_compiler.cpp", "llvm_irtoc_compiler.cpp", "llvm_logger.cpp", "llvm_options.cpp", "lowering/debug_data_builder.cpp", "lowering/gc_barriers.cpp", "lowering/irtoc_function_utils.cpp", "lowering/llvm_ir_constructor.cpp", "lowering/wrapped_module.cpp", "mir_compiler.cpp", "object_code/ark_aot_linker.cpp", "object_code/code_info_producer.cpp", "object_code/created_object_file.cpp", "object_code/dump.cpp", "target_machine_builder.cpp", "transforms/builtins.cpp", "transforms/gc_utils.cpp", "transforms/llvm_optimizer.cpp", "transforms/passes/aarch64_fixup_sdiv.cpp", "transforms/passes/ark_frame_lowering/frame_builder.cpp", "transforms/passes/ark_frame_lowering/frame_lowering.cpp", "transforms/passes/ark_gvn.cpp", "transforms/passes/ark_inlining.cpp", "transforms/passes/check_external.cpp", "transforms/passes/check_tail_calls.cpp", "transforms/passes/devirt.cpp", "transforms/passes/expand_atomics.cpp", "transforms/passes/fixup_poisons.cpp", "transforms/passes/gc_intrusion.cpp", "transforms/passes/gc_intrusion_check.cpp", "transforms/passes/gep_propagation.cpp", "transforms/passes/infer_flags.cpp", "transforms/passes/inline_devirt.cpp", "transforms/passes/inline_ir/cleanup_inline_module.cpp", "transforms/passes/inline_ir/discard_inline_module.cpp", "transforms/passes/inline_ir/inline_ir_utils.cpp", "transforms/passes/inline_ir/mark_always_inline.cpp", "transforms/passes/inline_ir/mark_inline_module.cpp", "transforms/passes/inline_ir/patch_return_handler_stack_adjustment.cpp", "transforms/passes/inline_ir/remove_unused_functions.cpp", "transforms/passes/insert_safepoints.cpp", "transforms/passes/intrinsics_lowering.cpp", "transforms/passes/loop_peeling.cpp", "transforms/passes/mem_barriers.cpp", "transforms/passes/panda_runtime_lowering.cpp", "transforms/passes/propagate_lenarray.cpp", "transforms/passes/prune_deopt.cpp", "transforms/runtime_calls.cpp", "utils.cpp", ] ohos_shared_library("libllvmbackend") { defines = [ "REQUIRED_LLVM_VERSION=$llvm_version" ] sources = libllvmbackend_sources configs = [ ":libllvmbackend_public_config", "$ark_root:ark_config", "$ark_root/compiler/aot/aot_builder:aotbuilder_public_config", "$ark_root/libpandabase:arkbase_public_config", "$ark_root/libpandafile:arkfile_public_config", "$ark_root/runtime:arkruntime_public_config", ] deps = [ ":libllvmbackend_can_compile_intrinsics_gen_inl", ":libllvmbackend_emit_intrinsic_llvm_ir_constructor_gen_inl", ":libllvmbackend_entrypoints_gen_inl", ":libllvmbackend_entrypoints_llvm_ark_interface_gen_inl", ":libllvmbackend_get_intrinsic_id_llvm_ark_interface_gen_h_inl", ":libllvmbackend_get_intrinsic_id_llvm_ark_interface_gen_inl", ":libllvmbackend_intrinsic_names_gen_inl", ":libllvmbackend_intrinsics_gen_inl", ":libllvmbackend_intrinsics_llvm_codegen_inl", ":libllvmbackend_llvm_ir_constructor_gen_h_inl", ":libllvmbackend_llvm_ir_constructor_gen_inl", ":libllvmbackend_llvm_logger_components_inc", ":libllvmbackend_llvm_options_gen_h", ":libllvmbackend_llvm_passes_inl", ":libllvmbackend_pipeline_gen_inc", ":libllvmbackend_pipeline_irtoc_gen_inc", ":llvm_lib", "$ark_root/compiler:libarktscompiler", "$ark_root/libpandabase:libarktsbase", "$ark_root/libpandafile:libarktsfile", ] external_deps = [ sdk_libc_secshared_dep ] if (is_llvm_aot) { libllvmbackend_aot_sources = [ "llvm_aot_compiler.cpp" ] sources += libllvmbackend_aot_sources } deps += [ "$ark_root/compiler/aot/aot_builder:aotbuilder" ] part_name = ark_part_name subsystem_name = ark_subsystem_name } ##### Generate llvmbackend_dir = "$ark_root/libllvmbackend" llvmbackend_templates_dir = "$llvmbackend_dir/templates" intrinsics_yaml = "$target_gen_dir/../runtime/intrinsics.yaml" ark_gen_file("libllvmbackend_intrinsics_gen_inl") { template_file = "$llvmbackend_templates_dir/intrinsics_gen.inl.erb" data = [ intrinsics_yaml ] api = [ "$llvmbackend_templates_dir/intrinsics.rb" ] requires = [ "$ark_root/libpandabase/utils.rb" ] output_file = "$target_gen_dir/intrinsics_gen.inl" extra_dependencies = [ "$ark_root/runtime:arkruntime_gen_intrinsics_yaml" ] } ark_gen_file("libllvmbackend_can_compile_intrinsics_gen_inl") { template_file = "$llvmbackend_templates_dir/can_compile_intrinsics_gen.inl.erb" data = [ intrinsics_yaml ] api = [ "$llvmbackend_templates_dir/intrinsics.rb" ] requires = [ "$ark_root/libpandabase/utils.rb" ] output_file = "$target_gen_dir/can_compile_intrinsics_gen.inl" extra_dependencies = [ "$ark_root/runtime:arkruntime_gen_intrinsics_yaml" ] } ark_gen_file("libllvmbackend_intrinsic_names_gen_inl") { template_file = "$llvmbackend_templates_dir/intrinsic_names_gen.inl.erb" data = [ intrinsics_yaml ] api = [ "$llvmbackend_templates_dir/intrinsics.rb" ] requires = [ "$ark_root/libpandabase/utils.rb" ] output_file = "$target_gen_dir/intrinsic_names_gen.inl" extra_dependencies = [ "$ark_root/runtime:arkruntime_gen_intrinsics_yaml" ] } ark_gen_file("libllvmbackend_intrinsics_llvm_codegen_inl") { template_file = "$llvmbackend_templates_dir/intrinsics_llvm_codegen.inl.erb" data = [ intrinsics_yaml ] api = [ "$llvmbackend_templates_dir/intrinsics.rb" ] requires = [ "$ark_root/libpandabase/utils.rb" ] output_file = "$target_gen_dir/intrinsics_llvm_codegen.inl" extra_dependencies = [ "$ark_root/runtime:arkruntime_gen_intrinsics_yaml" ] } entrypoints_yaml = "$ark_root/runtime/entrypoints/entrypoints.yaml" ark_gen_file("libllvmbackend_entrypoints_gen_inl") { template_file = "$llvmbackend_templates_dir/entrypoints_gen.inl.erb" data = [ entrypoints_yaml ] api = [ "$llvmbackend_templates_dir/entrypoints.rb" ] output_file = "$target_gen_dir/entrypoints_gen.inl" } ark_gen_file("libllvmbackend_entrypoints_llvm_ark_interface_gen_inl") { template_file = "$llvmbackend_templates_dir/entrypoints_llvm_ark_interface_gen.inl.erb" data = [ entrypoints_yaml ] api = [ "$llvmbackend_templates_dir/entrypoints.rb" ] output_file = "$target_gen_dir/entrypoints_llvm_ark_interface_gen.inl" } ark_gen_file("libllvmbackend_llvm_passes_inl") { template_file = "$llvmbackend_templates_dir/llvm_passes.inl.erb" data = [ "$llvmbackend_dir/transforms/passes/passes.yaml" ] api = [ "$llvmbackend_templates_dir/llvm_pass.rb" ] output_file = "$target_gen_dir/llvm_passes.inl" } ark_gen_file("libllvmbackend_llvm_options_gen_h") { template_file = "$ark_root/templates/options/options.h.erb" data = [ "llvmbackend.yaml" ] api = [ "$ark_root/templates/common.rb" ] output_file = "$target_gen_dir/llvm_options_gen.h" } ark_gen_file("libllvmbackend_llvm_logger_components_inc") { template_file = "$ark_root/templates/logger_components/logger_components.inc.erb" data = [ "llvmbackend.yaml" ] api = [ "$ark_root/templates/common.rb" ] output_file = "$target_gen_dir/llvm_logger_components.inc" } ark_gen_file("libllvmbackend_emit_intrinsic_llvm_ir_constructor_gen_inl") { extra_dependencies = [ "$ark_root:concat_plugins_yamls" ] template_file = "templates/emit_intrinsic_llvm_ir_constructor_gen.inl.erb" data = [ ark_plugin_options_yaml ] api = [ "$ark_root/templates/plugin_options.rb" ] output_file = "$target_gen_dir/emit_intrinsic_llvm_ir_constructor_gen.inl" } ark_gen_file("libllvmbackend_llvm_ir_constructor_gen_inl") { extra_dependencies = [ "$ark_root:concat_plugins_yamls" ] template_file = "templates/llvm_ir_constructor_gen.inl.erb" data = [ ark_plugin_options_yaml ] api = [ "$ark_root/templates/plugin_options.rb" ] output_file = "$target_gen_dir/llvm_ir_constructor_gen.inl" } ark_gen_file("libllvmbackend_llvm_ir_constructor_gen_h_inl") { extra_dependencies = [ "$ark_root:concat_plugins_yamls" ] template_file = "templates/llvm_ir_constructor_gen.h.inl.erb" data = [ ark_plugin_options_yaml ] api = [ "$ark_root/templates/plugin_options.rb" ] output_file = "$target_gen_dir/llvm_ir_constructor_gen.h.inl" } ark_gen_file("libllvmbackend_get_intrinsic_id_llvm_ark_interface_gen_h_inl") { extra_dependencies = [ "$ark_root:concat_plugins_yamls" ] template_file = "templates/get_intrinsic_id_llvm_ark_interface_gen.h.inl.erb" data = [ ark_plugin_options_yaml ] api = [ "$ark_root/templates/plugin_options.rb" ] output_file = "$target_gen_dir/get_intrinsic_id_llvm_ark_interface_gen.h.inl" } ark_gen_file("libllvmbackend_get_intrinsic_id_llvm_ark_interface_gen_inl") { extra_dependencies = [ "$ark_root:concat_plugins_yamls" ] template_file = "templates/get_intrinsic_id_llvm_ark_interface_gen.inl.erb" data = [ ark_plugin_options_yaml ] api = [ "$ark_root/templates/plugin_options.rb" ] output_file = "$target_gen_dir/get_intrinsic_id_llvm_ark_interface_gen.inl" } action("libllvmbackend_pipeline_gen_inc") { script = "$llvmbackend_templates_dir/pipeline.rb" outputs = [ "$target_gen_dir/pipeline_gen.inc" ] args = [ "-d", rebase_path("$llvmbackend_dir/transforms/pipeline.cfg"), "-o", rebase_path("$target_gen_dir/pipeline_gen.inc"), ] } ##### IRTOC ohos_source_set("bitcode") { cflags_cc = [ "-Wno-invalid-offsetof", "-emit-llvm", "-O1", "-mllvm", "-disable-llvm-optzns", ] sources = [ "$ark_root/runtime/class_linker.cpp", "$ark_root/runtime/entrypoints/entrypoints.cpp", "$ark_root/runtime/interpreter/runtime_interface.cpp", "$ark_root/runtime/mem/heap_manager.cpp", "$ark_root/runtime/mem/tlab.cpp", "$ark_root/runtime/object_header.cpp", "$ark_root/runtime/runtime.cpp", ] public_configs = [ "$ark_root:ark_config", "$ark_root/libpandabase:arkbase_public_config", "$ark_root/runtime:arkruntime_public_config", "$ark_root/runtime:arkruntime_config", "$ark_root/libpandafile:arkfile_public_config", ] deps = [ "$ark_root/compiler:libarkcompiler_intrinsics_gen_inl_intrinsics_enum_inl", "$ark_root/cross_values:cross_values_getters_generate(${default_toolchain})", "$ark_root/runtime:plugins_entrypoints_gen_h", ] external_deps = [ sdk_libc_secshared_dep ] part_name = ark_part_name subsystem_name = "$ark_subsystem_name" } action("irtoc_int_llvm_inl_module") { if (target_cpu == "arm64") { script = "$llvm_host_dir/bin/llvm-link" } else { script = "$llvm_dir/bin/llvm-link" } outputs = [ "$target_gen_dir/interpreter_inline.bc" ] deps = [ ":bitcode" ] args = [ rebase_path("$target_out_dir/../runtime/bitcode/runtime.o"), rebase_path( "$target_out_dir/../runtime/entrypoints/bitcode/entrypoints.o"), rebase_path( "$target_out_dir/../runtime/interpreter/bitcode/runtime_interface.o"), rebase_path("$target_out_dir/../runtime/bitcode/object_header.o"), rebase_path("$target_out_dir/../runtime/mem/bitcode/heap_manager.o"), rebase_path("$target_out_dir/../runtime/mem/bitcode/tlab.o"), rebase_path("$target_out_dir/../runtime/bitcode/class_linker.o"), "-o", rebase_path("$target_gen_dir/interpreter_inline.bc"), ] } action("libllvmbackend_pipeline_irtoc_gen_inc") { script = "$llvmbackend_templates_dir/pipeline.rb" outputs = [ "$target_gen_dir/pipeline_iroc_gen.inc" ] args = [ "-d", rebase_path("$llvmbackend_dir/transforms/pipeline_irtoc.cfg"), "-o", rebase_path("$target_gen_dir/pipeline_irtoc_gen.inc"), "-s", "_IRTOC", ] } }