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