1# Copyright (c) 2021-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 14import("//arkcompiler/runtime_core/static_core/ark_config.gni") 15import("//build/ohos.gni") 16import("$ark_root/plugins/plugins.gni") 17import("irtoc.gni") 18 19if (enable_irtoc) { 20 config("irtoc_public_config") { 21 include_dirs = [ 22 "$root_build_dir/generated", 23 "$target_gen_dir", 24 "$ark_root/irtoc", 25 ] 26 27 cflags_cc = [ 28 "-isystem", 29 rebase_path("$ark_third_party_root/elfio", root_build_dir), 30 "-isystem", 31 rebase_path("$ark_third_party_root/elfio/elfio", root_build_dir), 32 ] 33 } 34 35 irtoc_scripts = [ 36 "scripts/allocation.irt", 37 "scripts/resolvers.irt", 38 "scripts/interpreter.irt", 39 "scripts/monitors.irt", 40 "scripts/check_cast.irt", 41 "scripts/gc.irt", 42 "scripts/strings.irt", 43 "scripts/string_builder.irt", 44 "scripts/memcopy.irt", 45 "scripts/arrays.irt", 46 ] 47 irtoc_scripts += plugin_irtoc_scripts 48 49 generated_file("irtoc_plugins_file") { 50 outputs = [ irtoc_plugins_file ] 51 inputs = plugin_irtoc_plugins 52 output_conversion = "list lines" 53 contents = rebase_path(inputs, ark_root) 54 } 55 56 action("irtoc_compile") { 57 script = "$ark_root/irtoc/lang/irtoc.rb" 58 outputs = [ "$target_gen_dir/generated/irtoc_code.cpp" ] 59 if (is_llvm_interpreter) { 60 outputs += [ "$target_gen_dir/generated/irtoc_code_llvm.cpp" ] 61 } 62 63 sources = irtoc_scripts + [ irtoc_plugins_file ] 64 65 configs = [ "$ark_root:ark_config" ] 66 67 irt_args = rebase_path(irtoc_scripts, root_build_dir) 68 irt_outputs = rebase_path(outputs, root_build_dir) 69 70 args = [ 71 "--input", 72 string_join(":", irt_args), 73 "--output", 74 string_join(":", irt_outputs), 75 "--ark_source_dir", 76 rebase_path("$ark_root", root_build_dir), 77 "--isa", 78 rebase_path("$ark_isa_yaml", root_build_dir), 79 "{{defines}}", 80 "--arch", 81 target_cpu, 82 "--ir-api", 83 "ir-constructor", 84 "--plugins", 85 rebase_path(irtoc_plugins_file, root_build_dir), 86 ] 87 88 deps = [ 89 ":irtoc_plugins_file", 90 "$ark_root/isa:isa_combine", 91 ] 92 } 93 94 ark_gen_file("irtoc_options_h") { 95 template_file = "$ark_root/templates/options/options.h.erb" 96 data = [ "backend/options.yaml" ] 97 api = [ "$ark_root/templates/common.rb" ] 98 output_file = "$target_gen_dir/generated/irtoc_options_gen.h" 99 } 100 101 ohos_executable("irtoc") { 102 sources = [ 103 "$target_gen_dir/generated/irtoc_code.cpp", 104 "backend/compilation.cpp", 105 "backend/compiler/codegen_boundary.cpp", 106 "backend/compiler/codegen_fastpath.cpp", 107 "backend/compiler/dangling_pointers_checker.cpp", 108 "backend/function.cpp", 109 "backend/irtoc.cpp", 110 "backend/irtoc_options.cpp", 111 ] 112 configs = [ 113 ":irtoc_public_config", 114 "$ark_root:ark_config", 115 "$ark_root/libpandabase:arkbase_public_config", 116 "$ark_root/libpandafile:arkfile_public_config", 117 "$ark_root/compiler:arkcompiler_public_config", 118 "$ark_root/compiler/optimizer/code_generator:arkencoder_config", 119 "$ark_root/runtime/asm_defines:asmdefines_public_config", 120 "$ark_root/runtime:arkruntime_public_config", 121 ] 122 123 deps = [ 124 ":irtoc_options_h", 125 "$ark_root/compiler:irtoc_interface_extensions_includes_inl_h", 126 "$ark_root/compiler:libarktscompiler", 127 "$ark_root/compiler/optimizer/code_generator:libarkencoder", 128 "$ark_root/cross_values:cross_values_getters_generate(${default_toolchain})", 129 "$ark_root/irtoc:irtoc_compile", 130 "$ark_root/libpandabase:libarktsbase", 131 "$ark_root/runtime/asm_defines:asm_defines_generator", 132 ] 133 134 external_deps = [ sdk_libc_secshared_dep ] 135 if (defined(ohos_indep_compiler_enable) && ohos_indep_compiler_enable) { 136 external_deps += [ "elfio:elfio" ] 137 cflags_cc = [ "-Wno-error=missing-field-initializers" ] # for elfio.hpp 138 } 139 140 if (is_llvm_interpreter) { 141 sources += [ "$target_gen_dir/generated/irtoc_code_llvm.cpp" ] 142 } 143 if (is_llvm_interpreter || is_llvm_fastpath) { 144 configs += [ "$ark_root/libllvmbackend:libllvmbackend_public_config" ] 145 deps += [ "$ark_root/libllvmbackend:libllvmbackend" ] 146 } 147 148 libs = platform_libs 149 ldflags = platform_ldflags 150 151 install_enable = true 152 part_name = ark_part_name 153 subsystem_name = "$ark_subsystem_name" 154 } 155 156 action("irtoc_generate") { 157 irtoc_root_out_dir = 158 get_label_info("$ark_root/irtoc:irtoc(${host_toolchain})", 159 "root_out_dir") 160 if (ark_static_standalone_build) { 161 irtoc_cmd = irtoc_root_out_dir + "/bin/irtoc" 162 } else { 163 irtoc_cmd = 164 irtoc_root_out_dir + "/$ark_subsystem_name/$ark_part_name/irtoc" 165 } 166 167 script = irtoc_cmd 168 169 outputs = [ "$ark_root_gen_dir/generated/irtoc_lib.o" ] 170 args = [ 171 "--irtoc-output", 172 rebase_path("$ark_root_gen_dir/generated/irtoc_lib.o", root_build_dir), 173 "--compiler-cross-arch", 174 current_cpu, 175 ] 176 deps = [ ":irtoc(${host_toolchain})" ] 177 178 if (is_llvm_interpreter || is_llvm_fastpath) { 179 outputs += [ "$ark_root_gen_dir/generated/irtoc_llvm_lib.o" ] 180 args += [ 181 "--irtoc-output-llvm", 182 rebase_path("$ark_root_gen_dir/generated/irtoc_llvm_lib.o"), 183 ] 184 if (is_llvm_interpreter) { 185 args += [ 186 "--llvm-inline-module", 187 rebase_path( 188 "$target_gen_dir/../libllvmbackend/interpreter_inline.bc"), 189 ] 190 } 191 deps += [ "$ark_root/libllvmbackend:irtoc_int_llvm_inl_module" ] 192 } 193 } 194} 195