• 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
14cmake_minimum_required(VERSION 3.10)
15
16project(arkruntime)
17
18enable_language(ASM)
19
20include(core/Core.cmake)
21include(${PANDA_ROOT}/verification/Verification.cmake)
22
23set(SOURCES
24    assert_gc_scope.cpp
25    bridge/bridge.cpp
26    entrypoints/entrypoints.cpp
27    exceptions.cpp
28    class_linker.cpp
29    class_linker_extension.cpp
30    class_initializer.cpp
31    tooling/debugger.cpp
32    tooling/default_inspector_extension.cpp
33    tooling/pt_thread.cpp
34    tooling/debug_inf.cpp
35    tooling/tools.cpp
36    tooling/sampler/sampling_profiler.cpp
37    tooling/sampler/sample_writer.cpp
38    tooling/sampler/thread_communicator.cpp
39    tooling/sampler/stack_walker_base.cpp
40    tooling/sampler/lock_free_queue.cpp
41    field.cpp
42    gc_task.cpp
43    dprofiler/dprofiler.cpp
44    hotreload/hotreload.cpp
45    interpreter/interpreter.cpp
46    interpreter/runtime_interface.cpp
47    intrinsics.cpp
48    coretypes/string.cpp
49    coretypes/array.cpp
50    class.cpp
51    class_helper.cpp
52    locks.cpp
53    panda_vm.cpp
54    language_context.cpp
55    mem/gc/epsilon/epsilon.cpp
56    mem/gc/epsilon-g1/epsilon-g1.cpp
57    mem/gc/epsilon/epsilon_barrier.cpp
58    mem/gc/gc.cpp
59    mem/gc/gc_adaptive_stack.cpp
60    mem/gc/gc_settings.cpp
61    mem/gc/lang/gc_lang.cpp
62    mem/gc/gc_queue.cpp
63    mem/gc/gc_root.cpp
64    mem/gc/gc_root_type.cpp
65    mem/gc/gc_stats.cpp
66    mem/gc/gc_trigger.cpp
67    mem/gc/gc-hung/gc_hung.cpp
68    mem/gc/card_table.cpp
69    mem/gc/heap-space-misc/crossing_map.cpp
70    mem/gc/heap-space-misc/crossing_map_singleton.cpp
71    mem/gc/bitmap.cpp
72    mem/gc/gc_scope.cpp
73    mem/gc/gc_scoped_phase.cpp
74    mem/gc/workers/gc_worker.cpp
75    mem/gc/workers/gc_workers_task_pool.cpp
76    mem/gc/workers/gc_workers_task_queue.cpp
77    mem/gc/workers/gc_workers_thread_pool.cpp
78    mem/gc/stw-gc/stw-gc.cpp
79    mem/gc/gc_barrier_set.cpp
80    mem/gc/gen-gc/gen-gc.cpp
81    mem/refstorage/ref_block.cpp
82    mem/refstorage/reference_storage.cpp
83    mem/refstorage/global_object_storage.cpp
84    mem/allocator.cpp
85    mem/tlab.cpp
86    mem/heap_manager.cpp
87    mem/heap_verifier.cpp
88    mem/rendezvous.cpp
89    mem/runslots.cpp
90    mem/region_space.cpp
91    mem/object_helpers.cpp
92    mem/mem_stats_additional_info.cpp
93    mem/mem_stats_default.cpp
94    mem/mem_stats.cpp
95    mem/internal_allocator.cpp
96    mem/panda_string.cpp
97    mem/memory_manager.cpp
98    mem/heap_space.cpp
99    methodtrace/trace.cpp
100    mark_word.cpp
101    method.cpp
102    monitor.cpp
103    monitor_object_lock.cpp
104    monitor_pool.cpp
105    global_object_lock.cpp
106    object_header.cpp
107    regexp/ecmascript/regexp_parser.cpp
108    regexp/ecmascript/regexp_executor.cpp
109    regexp/ecmascript/regexp_opcode.cpp
110    regexp/ecmascript/mem/dyn_chunk.cpp
111    runtime.cpp
112    runtime_controller.cpp
113    string_table.cpp
114    thread.cpp
115    mt_thread_manager.cpp
116    lock_order_graph.cpp
117    time_utils.cpp
118    timing.cpp
119    compiler.cpp
120    vtable_builder_base.cpp
121    imtable_builder.cpp
122    cframe.cpp
123    stack_walker.cpp
124    deoptimization.cpp
125    object_accessor.cpp
126    osr.cpp
127    arch/asm_support.cpp
128    signal_handler.cpp
129    profilesaver/profile_saver.cpp
130    profilesaver/profile_dump_info.cpp
131    cha.cpp
132    runtime_helpers.cpp
133    handle_scope.cpp
134    file_manager.cpp
135    mem/gc/generational-gc-base.cpp
136    mem/gc/g1/g1-gc.cpp
137    mem/gc/g1/g1-helpers.cpp
138    mem/gc/g1/ref_updater.cpp
139    mem/gc/g1/g1-allocator.cpp
140    mem/gc/g1/g1_analytics.cpp
141    plugins.cpp
142    mem/gc/g1/update_remset_worker.cpp
143    mem/gc/g1/update_remset_thread.cpp
144    mem/gc/g1/update_remset_task_queue.cpp
145    mem/gc/g1/g1_pause_tracker.cpp
146    mem/gc/g1/hot_cards.cpp
147    relayout_profiler.cpp
148    loadable_agent.cpp
149    default_debugger_agent.cpp
150    coroutines/coroutine.cpp
151    coroutines/threaded_coroutine.cpp
152    coroutines/stackful_coroutine.cpp
153    coroutines/coroutine_manager.cpp
154    coroutines/threaded_coroutine_manager.cpp
155    coroutines/stackful_coroutine_manager.cpp
156    coroutines/stackful_coroutine_worker.cpp
157    coroutines/coroutine_events.cpp
158    coroutines/coroutine_stats.cpp
159    fibers/fiber_context.cpp
160    compiler_thread_pool_worker.cpp
161    compiler_task_manager_worker.cpp
162)
163
164if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
165    list(APPEND SOURCES
166        fibers/arch/arm/get.S
167        fibers/arch/arm/update.S
168        fibers/arch/arm/switch.S
169        bridge/arch/arm/interpreter_to_compiled_code_bridge_arm.S
170        bridge/arch/arm/compiled_code_to_interpreter_bridge_arm.S
171        bridge/arch/arm/compiled_code_to_interpreter_bridge_dyn_arm.S
172        bridge/arch/arm/interpreter_to_compiled_code_bridge_dyn_arm.S
173        bridge/arch/arm/compiled_code_to_runtime_bridge_arm.S
174        bridge/arch/arm/expand_compiled_code_args_dyn_arm.S
175        bridge/arch/arm/deoptimization_arm.S
176        arch/arm/osr_arm.S
177        arch/arm/interpreter_support.S)
178elseif (PANDA_TARGET_ARM32_ABI_HARD)
179    list(APPEND SOURCES
180        fibers/arch/arm/get.S
181        fibers/arch/arm/update.S
182        fibers/arch/arm/switch.S
183        bridge/arch/arm/interpreter_to_compiled_code_bridge_armhf.S
184        bridge/arch/arm/compiled_code_to_interpreter_bridge_armhf.S
185        bridge/arch/arm/compiled_code_to_interpreter_bridge_dyn_arm.S
186        bridge/arch/arm/interpreter_to_compiled_code_bridge_dyn_arm.S
187        bridge/arch/arm/compiled_code_to_runtime_bridge_arm.S
188        bridge/arch/arm/expand_compiled_code_args_dyn_arm.S
189        bridge/arch/arm/deoptimization_arm.S
190        arch/arm/osr_arm.S
191        arch/arm/interpreter_support.S)
192elseif(PANDA_TARGET_ARM64)
193    list(APPEND SOURCES
194        fibers/arch/aarch64/get.S
195        fibers/arch/aarch64/update.S
196        fibers/arch/aarch64/switch.S
197        bridge/arch/aarch64/interpreter_to_compiled_code_bridge_aarch64.S
198        bridge/arch/aarch64/compiled_code_to_interpreter_bridge_aarch64.S
199        bridge/arch/aarch64/compiled_code_to_interpreter_bridge_dyn_aarch64.S
200        bridge/arch/aarch64/interpreter_to_compiled_code_bridge_dyn_aarch64.S
201        bridge/arch/aarch64/compiled_code_to_runtime_bridge_aarch64.S
202        bridge/arch/aarch64/expand_compiled_code_args_dyn_aarch64.S
203        bridge/arch/aarch64/deoptimization_aarch64.S
204        arch/aarch64/osr_aarch64.S
205        arch/aarch64/interpreter_support.S)
206elseif(PANDA_TARGET_X86)
207    list(APPEND SOURCES
208        bridge/arch/x86/interpreter_to_compiled_code_bridge_x86.S
209        bridge/arch/x86/compiled_code_to_interpreter_bridge_x86.S
210        bridge/arch/x86/deoptimization_x86.S
211        arch/x86/osr_x86.S
212        arch/x86/interpreter_support.S)
213elseif(PANDA_TARGET_AMD64)
214    list(APPEND SOURCES
215        fibers/arch/amd64/get.S
216        fibers/arch/amd64/update.S
217        fibers/arch/amd64/switch.S
218        bridge/arch/amd64/compiled_code_to_interpreter_bridge_amd64.S
219        bridge/arch/amd64/compiled_code_to_interpreter_bridge_dyn_amd64.S
220        bridge/arch/amd64/interpreter_to_compiled_code_bridge_amd64.S
221        bridge/arch/amd64/interpreter_to_compiled_code_bridge_dyn_amd64.S
222        bridge/arch/amd64/compiled_code_to_runtime_bridge_amd64.S
223        bridge/arch/amd64/expand_compiled_code_args_dyn_amd64.S
224        bridge/arch/amd64/deoptimization_amd64.S
225        arch/amd64/common_amd64.S
226        arch/amd64/osr_amd64.S
227        arch/amd64/interpreter_support.S)
228endif()
229
230if (PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS)
231    list(APPEND SOURCES ${PANDA_ROOT}/platforms/mobile/runtime/thread.cpp)
232else()
233    list(APPEND SOURCES ${PANDA_ROOT}/platforms/common/runtime/thread.cpp)
234endif()
235
236if (PANDA_TARGET_MOBILE)
237    list(APPEND SOURCES ${PANDA_ROOT}/platforms/mobile/runtime/verify_app_install.cpp)
238else()
239    list(APPEND SOURCES ${PANDA_ROOT}/platforms/common/runtime/verify_app_install.cpp)
240endif()
241
242set(INTERPRETER_IMPL_SOURCES
243    interpreter/interpreter_impl.cpp
244)
245
246panda_add_library(arkruntime_interpreter_impl OBJECT ${INTERPRETER_IMPL_SOURCES})
247panda_set_lib_32bit_property(arkruntime_interpreter_impl)
248
249set(ISA_TEMPLATES
250    interpreter-inl_gen.h.erb
251    isa_constants_gen.h.erb
252    irtoc_interpreter_utils.h.erb
253    debug_test_interpreter-inl_gen.cpp.erb
254)
255
256set(GEN_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
257file(MAKE_DIRECTORY ${GEN_INCLUDE_DIR})
258panda_isa_gen(
259    TEMPLATES ${ISA_TEMPLATES}
260    SOURCE ${CMAKE_CURRENT_LIST_DIR}/interpreter/templates
261    DESTINATION ${GEN_INCLUDE_DIR}
262)
263
264set(ISA "${CMAKE_BINARY_DIR}/isa/isa.yaml")
265set(ISA_API "${PANDA_ROOT}/isa/isapi.rb")
266set(BRIDGE_DISPATCH_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/templates/bridge_dispatch.S.erb")
267set(BRIDGE_DISPATCH_DYN_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/templates/bridge_dispatch_dyn.S.erb")
268set(BRIDGE_ARCHS aarch64 arm armhf amd64 x86)
269foreach(arch ${BRIDGE_ARCHS})
270    panda_gen_file(
271        DATA ${ISA}
272        TEMPLATE ${BRIDGE_DISPATCH_TEMPLATE}
273        OUTPUTFILE ${GEN_INCLUDE_DIR}/bridge_dispatch_${arch}.S
274        API ${ISA_API}
275        REQUIRES
276            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_${arch}.rb
277            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_common.rb
278            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_static.rb
279    )
280    add_custom_target(bridge_dispatch_${arch} DEPENDS ${GEN_INCLUDE_DIR}/bridge_dispatch_${arch}.S ${ISA})
281    add_dependencies(bridge_dispatch_${arch} isa_assert)
282
283    panda_gen_file(
284        DATA ${ISA}
285        TEMPLATE ${BRIDGE_DISPATCH_DYN_TEMPLATE}
286        OUTPUTFILE ${GEN_INCLUDE_DIR}/bridge_dispatch_dyn_${arch}.S
287        API ${ISA_API}
288        REQUIRES
289            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_${arch}.rb
290            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_common.rb
291            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_dynamic.rb
292    )
293    add_custom_target(bridge_dispatch_dyn_${arch} DEPENDS ${GEN_INCLUDE_DIR}/bridge_dispatch_dyn_${arch}.S ${ISA})
294    add_dependencies(bridge_dispatch_dyn_${arch} isa_assert)
295
296endforeach()
297
298set(GENERATOR ${PANDA_ROOT}/libpandafile/types.rb)
299set(TEMPLATE ${CMAKE_CURRENT_LIST_DIR}/templates/shorty_values.h.erb)
300set(DATAFILE ${PANDA_ROOT}/libpandafile/types.yaml)
301set(DEPENDENCIES ${GENERATOR} ${TEMPLATE} ${DATAFILE})
302set(OUTFILE "${CMAKE_CURRENT_BINARY_DIR}/include/shorty_values.h")
303add_custom_command(OUTPUT "${OUTFILE}"
304                   COMMENT "Generate shorty_values.h"
305                   COMMAND ${PANDA_ROOT}/isa/gen.rb -d ${DATAFILE} -t ${TEMPLATE} -o "${OUTFILE}" -q ${GENERATOR}
306                   DEPENDS ${DEPENDENCIES})
307add_custom_target(shorty_values_gen_${PROJECT_NAME} ALL DEPENDS "${OUTFILE}")
308add_dependencies(panda_gen_files shorty_values_gen_${PROJECT_NAME})
309
310panda_target_compile_options(arkruntime_interpreter_impl PUBLIC -Wno-invalid-offsetof)
311
312set_property(TARGET arkruntime_interpreter_impl PROPERTY POSITION_INDEPENDENT_CODE ON)
313
314if (PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES)
315    if (PANDA_TARGET_ARM64)
316        panda_target_compile_options(arkruntime_interpreter_impl PUBLIC -ffixed-x20 -ffixed-x21 -ffixed-x22 -ffixed-x23 -ffixed-x24 -ffixed-x25 -ffixed-x28)
317        panda_target_compile_definitions(arkruntime_interpreter_impl PUBLIC FFIXED_REGISTERS)
318    endif()
319
320    # Temporary disable clang tidy as it cannot recognize -ffixed-<reg> params that we used. Should be fixed in clang tidy 9
321    set_target_properties(arkruntime_interpreter_impl PROPERTIES CXX_CLANG_TIDY "")
322endif()
323
324panda_target_include_directories(arkruntime_interpreter_impl
325    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
326    PUBLIC ${PANDA_ROOT}
327    PUBLIC ${GEN_INCLUDE_DIR}
328    PUBLIC ${PANDA_ROOT}/compiler
329    PUBLIC ${PANDA_ROOT}/libpandabase
330    PUBLIC ${PANDA_ROOT}/libpandafile
331    PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options
332    PUBLIC ${PANDA_BINARY_ROOT}
333    PUBLIC ${PANDA_BINARY_ROOT}/libpandafile/include
334    PUBLIC ${PANDA_BINARY_ROOT}/libpandabase/generated
335    PUBLIC ${VERIFIER_INCLUDE_DIR}
336    PUBLIC ${PANDA_BINARY_ROOT}
337)
338
339panda_target_include_directories(arkruntime_interpreter_impl
340    SYSTEM PRIVATE "$<TARGET_PROPERTY:c_secshared,INCLUDE_DIRECTORIES>"
341)
342
343add_dependencies(arkruntime_interpreter_impl
344    isa_gen_${PROJECT_NAME}
345    ${PROJECT_NAME}_obj_options
346    intrinsics_gen_${PROJECT_NAME}
347    shorty_values_gen_${PROJECT_NAME}
348    arkbase
349    arkfile
350    entrypoints_gen
351)
352
353add_dependencies(arkcompiler entrypoints_gen entrypoints_compiler_checksum_gen)
354
355if (HOST_TOOLS)
356    # Host tools should take bitcode compiled for target
357    SET_SOURCE_FILES_PROPERTIES(${IRTOC_INT_LLVM_INL_MODULE} PROPERTIES
358            EXTERNAL_OBJECT true
359            GENERATED true)
360    add_custom_target(irtoc_int_llvm_inl_module)
361elseif (PANDA_LLVM_INTERPRETER AND PANDA_LLVM_INTERPRETER_INLINING)
362    set(sources
363            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/entrypoints/entrypoints.cpp
364            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/interpreter/runtime_interface.cpp
365            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/object_header.cpp
366            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/mem/heap_manager.cpp
367            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/mem/tlab.cpp
368            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/runtime.cpp
369            $<TARGET_PROPERTY:arkruntime_obj,SOURCE_DIR>/class_linker.cpp
370    )
371    set(outputs "")
372    panda_add_llvm_bc_lib(TARGET irtoc_int_llvm_inl_module
373            SOURCES ${sources}
374            INCLUDES $<TARGET_PROPERTY:arkruntime_obj,INCLUDE_DIRECTORIES>
375            DEPENDS arkruntime_obj_options
376            asm_defines
377            compiler_options
378            compiler_intrinsics
379            cpu_features_gen
380            cross_values
381            entrypoints_compiler_checksum_gen
382            intrinsics_gen_arkruntime
383            intrinsics_gen_compiler
384            instructions_gen_compiler
385            isa_gen_compiler
386            profiling_gen
387            runtime_intrinsics_inl
388            OUTPUT_VARIABLE outputs
389    )
390    set(IRTOC_INT_LLVM_INL_MODULE "${outputs}")
391    # Create the file with a list of bitcode files
392    file(GENERATE OUTPUT ${IRTOC_INT_LLVM_INL_MODULE_FILES_LIST} CONTENT "${outputs}")
393else()
394    add_custom_target(irtoc_int_llvm_inl_module)
395endif()
396
397if(NOT (CMAKE_CROSSCOMPILING OR PANDA_TARGET_OHOS))
398    set(skip_fastpath_validation FALSE)
399    if (IRTOC_TARGET STREQUAL "arm64" AND PANDA_LLVM_INTERPRETER)
400        set(skip_fastpath_validation TRUE)
401    endif()
402    irtoc_compile(TARGET_NAME irtoc_fastpath
403                  INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/common.irt
404                              ${IRTOC_SOURCE_DIR}/scripts/resolvers.irt
405                              ${IRTOC_SOURCE_DIR}/scripts/allocation.irt
406                              ${IRTOC_SOURCE_DIR}/scripts/monitors.irt
407                              ${IRTOC_SOURCE_DIR}/scripts/check_cast.irt
408                              ${IRTOC_SOURCE_DIR}/scripts/gc.irt
409                              ${IRTOC_SOURCE_DIR}/scripts/strings.irt
410                              ${IRTOC_SOURCE_DIR}/scripts/string_builder.irt
411                              ${IRTOC_SOURCE_DIR}/scripts/string_helpers.irt
412                              ${IRTOC_SOURCE_DIR}/scripts/memcopy.irt
413                              ${IRTOC_SOURCE_DIR}/scripts/arrays.irt
414                  TARGET_VARIABLE IRTOC_FASTPATH_OBJ
415                  TARGET_VARIABLE_LLVM IRTOC_FASTPATH_LLVM_OBJ
416                  SKIP_VALIDATION ${skip_fastpath_validation})
417
418    irtoc_compile(TARGET_NAME irtoc_interpreter
419                  INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/interpreter.irt
420                  TARGET_VARIABLE IRTOC_INTERPRETER_OBJ
421                  LLVM_BACKEND_INLINE_MODULE_FILES ${IRTOC_INT_LLVM_INL_MODULE}
422                  TARGET_VARIABLE_LLVM IRTOC_INTERPRETER_LLVM_OBJ)
423    set(irtoc_fastpath_target irtoc_fastpath)
424    set(irtoc_interpreter_target irtoc_interpreter)
425else()
426    ExternalProject_Get_Property(panda_host_tools binary_dir)
427    set(IRTOC_FASTPATH_OBJ "${binary_dir}/irtoc/irtoc_fastpath/irtoc_fastpath.o")
428    set(IRTOC_FASTPATH_LLVM_OBJ "${binary_dir}/irtoc/irtoc_fastpath/irtoc_fastpath_llvm.o")
429    set(IRTOC_INTERPRETER_OBJ "${binary_dir}/irtoc/irtoc_interpreter/irtoc_interpreter.o")
430    set(IRTOC_INTERPRETER_LLVM_OBJ "${binary_dir}/irtoc/irtoc_interpreter/irtoc_interpreter_llvm.o")
431
432    SET_SOURCE_FILES_PROPERTIES(${IRTOC_FASTPATH_OBJ} PROPERTIES
433        EXTERNAL_OBJECT true
434        GENERATED true
435    )
436    SET_SOURCE_FILES_PROPERTIES(${IRTOC_FASTPATH_LLVM_OBJ} PROPERTIES
437        EXTERNAL_OBJECT true
438        GENERATED true
439    )
440    SET_SOURCE_FILES_PROPERTIES(${IRTOC_INTERPRETER_OBJ} PROPERTIES
441        EXTERNAL_OBJECT true
442        GENERATED true
443    )
444    SET_SOURCE_FILES_PROPERTIES(${IRTOC_INTERPRETER_LLVM_OBJ} PROPERTIES
445        EXTERNAL_OBJECT true
446        GENERATED true
447    )
448    add_dependencies(host_tools_depends irtoc_int_llvm_inl_module)
449    set(irtoc_fastpath_target panda_host_tools-build)
450    set(irtoc_interpreter_target panda_host_tools-build)
451endif()
452
453set(IRTOC_LLVM_OBJECTS "")
454
455if (PANDA_LLVM_FASTPATH)
456    list(APPEND IRTOC_LLVM_OBJECTS ${IRTOC_FASTPATH_LLVM_OBJ})
457endif()
458
459if (PANDA_LLVM_INTERPRETER)
460    list(APPEND IRTOC_LLVM_OBJECTS ${IRTOC_INTERPRETER_LLVM_OBJ})
461endif()
462
463set(ARKRUNTIME_SOURCES
464    ${SOURCES}
465    ${CORE_VM_SOURCES}
466    ${VERIFIER_SOURCES}
467)
468
469panda_add_library(arkruntime_obj OBJECT
470    ${ARKRUNTIME_SOURCES}
471)
472
473set_target_properties(arkruntime_obj PROPERTIES POSITION_INDEPENDENT_CODE ON)
474
475if (PANDA_WITH_HIDDEN_SYMBOLS)
476    set_target_properties(arkruntime_obj PROPERTIES
477        CXX_VISIBILITY_PRESET hidden
478        VISIBILITY_INLINES_HIDDEN ON
479    )
480endif()
481
482panda_add_library(arkruntime_interpreter_static STATIC
483    $<TARGET_OBJECTS:arkruntime_interpreter_impl>
484    ${IRTOC_FASTPATH_OBJ}
485    ${IRTOC_INTERPRETER_OBJ}
486    ${IRTOC_LLVM_OBJECTS}
487)
488
489panda_add_library(arkruntime_static STATIC
490    $<TARGET_OBJECTS:arkruntime_obj>
491    $<TARGET_OBJECTS:arkruntime_interpreter_impl>
492    ${IRTOC_FASTPATH_OBJ}
493    ${IRTOC_INTERPRETER_OBJ}
494    ${IRTOC_LLVM_OBJECTS}
495)
496panda_target_link_libraries(arkruntime_static arkruntime_obj)
497
498add_dependencies(arkruntime_interpreter_static
499    intrinsics_gen_${PROJECT_NAME}
500    isa_gen_pandaverification
501    messages_gen_pandaverification
502    messages_data_pandaverification
503    arkstdlib
504    asm_defines_generator
505    entrypoints_gen
506    profiling_gen
507    ${irtoc_fastpath_target}
508    ${irtoc_interpreter_target}
509)
510
511set(STACK_WALKER_HOOK_BRIDGE_SOURCE "")
512
513if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
514    list(APPEND STACK_WALKER_HOOK_BRIDGE_SOURCE tests/arch/arm/stack_walker_hook_bridge.S)
515elseif (PANDA_TARGET_ARM32_ABI_HARD)
516    list(APPEND STACK_WALKER_HOOK_BRIDGE_SOURCE tests/arch/arm/stack_walker_hook_bridge.S)
517elseif(PANDA_TARGET_ARM64)
518    list(APPEND STACK_WALKER_HOOK_BRIDGE_SOURCE tests/arch/aarch64/stack_walker_hook_bridge.S)
519elseif(PANDA_TARGET_AMD64)
520    list(APPEND STACK_WALKER_HOOK_BRIDGE_SOURCE tests/arch/amd64/stack_walker_hook_bridge.S)
521endif()
522
523panda_add_library(arkruntime_stack_walker_obj OBJECT ${STACK_WALKER_HOOK_BRIDGE_SOURCE})
524add_dependencies(arkruntime_stack_walker_obj arkruntime_obj)
525panda_target_include_directories(arkruntime_stack_walker_obj
526    PUBLIC ${PANDA_BINARY_ROOT}/runtime/asm_defines
527    PUBLIC ${PANDA_BINARY_ROOT}/runtime/include
528    PUBLIC ${PANDA_ROOT}/runtime
529)
530
531panda_target_sources(arkruntime_static PRIVATE ${STACK_WALKER_HOOK_BRIDGE_SOURCE})
532
533panda_add_library(arkruntime SHARED $<TARGET_OBJECTS:arkruntime_obj> $<TARGET_OBJECTS:arkruntime_interpreter_impl>)
534panda_target_link_libraries(arkruntime arkruntime_obj arkruntime_interpreter_static)
535if (NOT PANDA_USE_PREBUILT_TARGETS)
536    add_dependencies(arkruntime arkruntime_static)
537endif ()
538
539add_subdirectory(scheduler)
540add_subdirectory(asm_defines)
541
542add_dependencies(arkruntime_obj
543    intrinsics_gen_${PROJECT_NAME}
544    isa_gen_pandaverification
545    messages_gen_pandaverification
546    messages_data_pandaverification
547    arkstdlib
548    asm_defines_generator
549    entrypoints_gen
550    profiling_gen
551    ${irtoc_fastpath_target}
552    ${irtoc_interpreter_target}
553)
554
555if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
556    add_dependencies(arkruntime_obj bridge_dispatch_arm bridge_dispatch_dyn_arm)
557    add_dependencies(panda_gen_files bridge_dispatch_arm bridge_dispatch_dyn_arm)
558elseif (PANDA_TARGET_ARM32_ABI_HARD)
559    add_dependencies(arkruntime_obj bridge_dispatch_armhf bridge_dispatch_dyn_arm)
560    add_dependencies(panda_gen_files bridge_dispatch_armhf bridge_dispatch_dyn_arm)
561elseif(PANDA_TARGET_ARM64)
562    add_dependencies(arkruntime_obj bridge_dispatch_aarch64 bridge_dispatch_dyn_aarch64)
563    add_dependencies(panda_gen_files bridge_dispatch_aarch64 bridge_dispatch_dyn_aarch64)
564elseif(PANDA_TARGET_X86)
565    add_dependencies(arkruntime_obj bridge_dispatch_x86)
566    add_dependencies(panda_gen_files bridge_dispatch_x86)
567elseif(PANDA_TARGET_AMD64)
568    add_dependencies(arkruntime_obj bridge_dispatch_amd64 bridge_dispatch_dyn_amd64)
569    add_dependencies(panda_gen_files bridge_dispatch_amd64 bridge_dispatch_dyn_amd64)
570endif()
571
572panda_target_include_directories(arkruntime_obj
573    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
574    PUBLIC ${PANDA_ROOT}
575    PUBLIC ${PANDA_BINARY_ROOT}
576    PUBLIC ${PANDA_BINARY_ROOT}/runtime/asm_defines
577    PUBLIC ${GEN_INCLUDE_DIR}
578    PUBLIC ${VERIFIER_INCLUDE_DIR}
579)
580
581panda_target_link_libraries(arkruntime_obj arkbase arkfile arkcompiler dprof arkaotmanager)
582if (NOT PANDA_TARGET_OHOS)
583  panda_target_link_libraries(arkruntime_obj atomic)
584endif()
585
586set(CSA_TESTS_ARKRUNTIME_PATH ${GEN_INCLUDE_DIR}/debug_test_interpreter-inl_gen.cpp)
587panda_add_library(csa_tests_arkruntime_interpreter_impl OBJECT EXCLUDE_FROM_ALL ${CSA_TESTS_ARKRUNTIME_PATH})
588panda_target_include_directories(csa_tests_arkruntime_interpreter_impl
589    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
590    PUBLIC ${PANDA_ROOT}
591    PUBLIC ${GEN_INCLUDE_DIR}
592    PUBLIC ${PANDA_ROOT}/compiler
593    PUBLIC ${PANDA_ROOT}/libpandabase
594    PUBLIC ${PANDA_ROOT}/libpandafile
595    PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options
596    PUBLIC ${PANDA_BINARY_ROOT}
597    PUBLIC ${PANDA_BINARY_ROOT}/compiler/generated
598    PUBLIC ${PANDA_BINARY_ROOT}/libpandafile/include
599    PUBLIC ${PANDA_BINARY_ROOT}/libpandabase/generated
600    PUBLIC ${VERIFIER_INCLUDE_DIR}
601    PUBLIC ${PANDA_BINARY_ROOT}
602)
603
604panda_target_include_directories(csa_tests_arkruntime_interpreter_impl
605    SYSTEM PRIVATE "$<TARGET_PROPERTY:c_secshared,INCLUDE_DIRECTORIES>"
606)
607
608add_dependencies(csa_tests_arkruntime_interpreter_impl arkruntime_static)
609
610# Runtime uses CodeInfo from the compiler. Maybe in the future CodeInfo
611# will be moved to another place, then this line should be removed.
612panda_target_include_directories(arkruntime_obj PUBLIC ${PANDA_ROOT}/compiler)
613
614# Disable warning about offsetof usage for non-standard layout types.
615# In C++17 offsetof is conditionally implemented for such types, so
616# compiler should issue error if it doesn't implemented offsetof for
617# them. Also we use static asserts to ensure that offsetof works correcly
618# for non-standard layout types.
619panda_target_compile_options(arkruntime_obj PUBLIC -Wno-invalid-offsetof)
620
621if(PANDA_WITH_TESTS)
622  set(TEST_INTERPRETER_IMPL_SOURCES
623    tests/interpreter/test_interpreter_impl.cpp
624    )
625
626  panda_add_library(arkruntime_test_interpreter_impl OBJECT ${TEST_INTERPRETER_IMPL_SOURCES})
627
628  panda_target_compile_options(arkruntime_test_interpreter_impl PUBLIC -Wno-invalid-offsetof)
629  panda_set_lib_32bit_property(arkruntime_test_interpreter_impl)
630
631  if (PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES)
632    if (PANDA_TARGET_ARM64)
633      panda_target_compile_options(arkruntime_test_interpreter_impl PUBLIC -ffixed-x20 -ffixed-x21 -ffixed-x22 -ffixed-x23 -ffixed-x24 -ffixed-x25 -ffixed-x28)
634      panda_target_compile_definitions(arkruntime_test_interpreter_impl PUBLIC FFIXED_REGISTERS)
635    endif()
636
637    # Temporary disable clang tidy as it cannot recognize -ffixed-<reg> params that we used. Should be fixed in clang tidy 9
638    set_target_properties(arkruntime_test_interpreter_impl PROPERTIES CXX_CLANG_TIDY "")
639  endif()
640
641  panda_target_include_directories(arkruntime_test_interpreter_impl
642    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
643    PUBLIC ${PANDA_ROOT}
644    PUBLIC ${GEN_INCLUDE_DIR}
645    PUBLIC ${PANDA_ROOT}/compiler
646    PUBLIC ${PANDA_ROOT}/libpandabase
647    PUBLIC ${PANDA_ROOT}/libpandafile
648    PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options
649    PUBLIC ${PANDA_BINARY_ROOT}/libpandafile/include
650    PUBLIC ${PANDA_BINARY_ROOT}
651    PUBLIC ${PANDA_BINARY_ROOT}/libpandabase/generated
652    PUBLIC ${VERIFIER_INCLUDE_DIR}
653    )
654
655  panda_target_include_directories(arkruntime_test_interpreter_impl
656    SYSTEM PUBLIC "$<TARGET_PROPERTY:c_secshared,INCLUDE_DIRECTORIES>"
657  )
658
659
660  if (PANDA_WITH_TESTS)
661      panda_target_include_directories(arkruntime_test_interpreter_impl
662          SYSTEM PUBLIC "$<TARGET_PROPERTY:gtest,INCLUDE_DIRECTORIES>")
663  endif()
664
665
666  add_dependencies(arkruntime_test_interpreter_impl
667    isa_gen_${PROJECT_NAME}
668    intrinsics_gen_${PROJECT_NAME}
669    ${PROJECT_NAME}_obj_options
670    arkbase
671    arkfile
672    entrypoints_gen
673    profiling_gen
674    runtime_language_context
675    runtime_intrinsics_inl
676    source_languages_h
677    )
678endif()
679
680if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
681SET(INVOKE_HELPER tests/arch/arm/invokation_helper.S)
682elseif (PANDA_TARGET_ARM32_ABI_HARD)
683SET(INVOKE_HELPER tests/arch/arm/invokation_helper_hf.S)
684elseif(PANDA_TARGET_ARM64)
685SET(INVOKE_HELPER tests/arch/aarch64/invokation_helper.S)
686elseif(PANDA_TARGET_X86)
687#SET(INVOKE_HELPER tests/arch/x86/invokation_helper.S)
688elseif(PANDA_TARGET_AMD64)
689SET(INVOKE_HELPER tests/arch/amd64/invokation_helper.S)
690endif()
691
692function(add_gtests test_name)
693    cmake_parse_arguments(ARG "NO_WARNING_FILTER" "TEST_GROUP;STASH_LIST" "" ${ARGN})
694    set(FLAGS_LIST NO_CORES)
695    if (ARG_NO_WARNING_FILTER)
696        set(FLAGS_LIST "${FLAGS_LIST};NO_WARNING_FILTER")
697    endif()
698    panda_add_gtest(
699        ${FLAGS_LIST}
700        NAME ${test_name}
701        SOURCES
702            ${ARG_UNPARSED_ARGUMENTS}
703        LIBRARIES
704            arkruntime
705            arkassembler
706            arkdisassembler
707        SANITIZERS
708            ${PANDA_SANITIZERS_LIST}
709        DEPS_TARGETS
710            arkstdlib
711        TEST_GROUP
712            ${ARG_TEST_GROUP}
713        STASH_LIST
714            ${ARG_STASH_LIST}
715    )
716
717    if(TARGET ${test_name})
718        panda_target_include_directories(${test_name}
719            PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
720            PUBLIC ${PANDA_ROOT}
721            PRIVATE ${GEN_INCLUDE_DIR}
722        )
723        panda_target_compile_options(${test_name} PUBLIC "-Wno-ignored-attributes")
724    endif()
725
726endfunction()
727
728if (INTRUSIVE_TESTING)
729    if (NOT PANDA_ENABLE_THREAD_SANITIZER)
730        message(FATAL_ERROR "Intrusive testing requires enabled thread sanitizer, please set -DPANDA_ENABLE_THREAD_SANITIZER=true.")
731    endif()
732    if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14))
733        message(FATAL_ERROR "Intrusive testing requires compiler clang++-14 or higher.")
734    endif()
735    set(IS_RUNTIME_INTRUSIVE_BUILD false)
736    add_subdirectory(tests/intrusive-tests ${PANDA_BINARY_ROOT}/runtime/tests/intrusive_tests/tests)
737
738    set(IS_RUNTIME_INTRUSIVE_BUILD true)
739    add_subdirectory(${PANDA_ROOT}/runtime/tests/intrusive-tests ${CMAKE_BINARY_DIR}/runtime/tests/intrusive_tests)
740endif()
741
742function(add_multithread_gtests test_name)
743    panda_add_gtest(
744        NAME ${test_name}
745        SOURCES
746            ${ARGN}
747        LIBRARIES
748            arkruntime
749            arkassembler
750        SANITIZERS
751            ${PANDA_SANITIZERS_LIST}
752    )
753
754    if(TARGET ${test_name})
755        panda_target_include_directories(${test_name}
756            PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
757            PUBLIC ${PANDA_ROOT}
758            PRIVATE ${GEN_INCLUDE_DIR}
759        )
760        panda_target_compile_options(${test_name} PUBLIC "-Wno-ignored-attributes")
761    endif()
762
763endfunction()
764
765add_multithread_gtests (
766    arkruntime_multithreaded_test
767    tests/multithreaded_intern_string_table_test.cpp
768)
769
770add_gtests(
771    arkruntime_bitmap_ClearRange_test
772    tests/bitmap_clear_range_test.cpp
773)
774
775add_gtests(
776    arkruntime_bitmap_OrderObjectAlignment_test
777    tests/bitmap_order_object_alignment_test.cpp
778)
779
780add_gtests(
781    arkruntime_bitmap_VisitorObjectAlignment_test
782    tests/bitmap_visitor_object_alignment_test.cpp
783)
784
785add_gtests(
786    arkruntime_bitmap_PageAlignment_test
787    tests/bitmap_page_alignment_test.cpp
788)
789
790add_gtests(
791    arkruntime_fibers_test
792    tests/fibers_test.cpp
793    NO_WARNING_FILTER
794)
795
796add_gtests(
797    arkruntime_core_layout_test
798    tests/array_test.cpp
799    tests/mark_word_test.cpp
800    tests/method_test.cpp
801    tests/compiler_thread_pool.cpp
802    tests/mock_queue_thread_pool.cpp
803    tests/string_table_test.cpp
804    tests/string_test.cpp
805    tests/compilation_status_test.cpp
806    tests/osr_code_test.cpp
807)
808
809add_gtests(
810    arkruntime_get_method_test
811    tests/getmethod_test.cpp
812)
813
814add_gtests(
815    arkruntime_memory_mem_leak_test
816    tests/mem_leak_test.cpp
817)
818
819add_gtests(
820    arkruntime_memory_statistic_test
821    tests/histogram_test.cpp
822    tests/mem_stats_additional_info_test.cpp
823    tests/mem_stats_gc_test.cpp
824    tests/mem_stats_gen_gc_test.cpp
825    tests/mem_stats_test.cpp
826)
827
828add_gtests(
829    arkruntime_memory_management_bump_allocator_test
830    tests/bump_allocator_test.cpp
831)
832
833add_gtests(
834    arkruntime_memory_management_frame_allocators_test
835    tests/frame_allocator_test.cpp
836    tests/stack_like_allocator_test.cpp
837)
838
839add_gtests(
840    arkruntime_memory_management_freelist_allocator_test
841    tests/freelist_allocator_test.cpp
842)
843
844add_gtests(
845    arkruntime_memory_management_humongous_obj_allocator_test
846    tests/humongous_obj_allocator_test.cpp
847)
848
849add_gtests(
850    arkruntime_memory_management_internal_allocator_test
851    tests/internal_allocator_test.cpp
852)
853
854add_gtests(
855    arkruntime_memory_management_malloc-proxy-allocator-test
856    tests/malloc-proxy-allocator-test.cpp
857)
858
859add_gtests(
860    arkruntime_memory_management_pygote_space_allocator_gen_test
861    tests/pygote_space_allocator_test_base.cpp
862    tests/pygote_space_allocator_gen_test.cpp
863)
864
865add_gtests(
866    arkruntime_memory_management_pygote_space_allocator_stw_test
867    tests/pygote_space_allocator_test_base.cpp
868    tests/pygote_space_allocator_stw_test.cpp
869)
870
871add_gtests(
872    arkruntime_memory_management_region_allocator_test
873    tests/region_allocator_test.cpp
874)
875
876add_gtests(
877    arkruntime_memory_management_rem_set_test
878    tests/rem_set_test.cpp
879)
880
881add_gtests(
882    arkruntime_memory_management_runslots_allocator_test
883    tests/runslots_allocator_test.cpp
884)
885
886add_gtests(
887    arkruntime_memory_management_test_2
888    tests/card_table_test.cpp
889    tests/crossing_map_test.cpp
890    tests/panda_smart_pointers_test.cpp
891    tests/panda_tl_containers_test.cpp
892    tests/tlab_test.cpp
893    tests/gc_task_test.cpp
894    tests/epsilon_gcs_test.cpp
895    tests/g1gc_test.cpp
896    tests/collection_set_test.cpp
897    tests/g1gc_fullgc_test.cpp
898    tests/object_helpers_test.cpp
899    tests/gc_log_test.cpp
900    tests/explicit_gc_test.cpp
901    tests/intrusive_gc_test_api_test.cpp
902    tests/g1_pause_tracker_test.cpp
903    tests/g1_analytics_test.cpp
904)
905
906add_gtests(
907    arkruntime_sa_object_helpers_test
908    tests/static_analyzer_test.cpp
909)
910
911add_gtests(
912    arkruntime_gc_trigger_test
913    tests/gc_trigger_test.cpp
914)
915
916add_gtests(
917    arkruntime_memory_management_heap_space_test
918    tests/heap_space_test.cpp
919)
920
921add_gtests(
922    arkruntime_multithreading_test
923    tests/compiler_queue_test.cpp
924    tests/monitor_test.cpp
925    tests/thread_test.cpp
926)
927
928add_gtests(
929    arkruntime_options_test
930    tests/options_test.cpp
931)
932
933add_gtests(
934    arkruntime_signal_test
935    tests/signal_handler_test.cpp
936)
937
938add_gtests(
939    arkruntime_regexp_test
940    tests/regexp_test.cpp
941    tests/dyn_buffer_test.cpp
942)
943
944# We run irtoc tests only in host mode, because irtoc tests are intended for testing only Irtoc language capabilities.
945if (PANDA_WITH_TESTS OR HOST_TOOLS)
946    if (NOT CMAKE_CROSSCOMPILING)
947        irtoc_compile(TARGET_NAME irtoc_tests
948            INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/tests.irt
949            TARGET_VARIABLE IRTOC_TESTS_OBJ)
950        set(irtoc_tests_target irtoc_tests)
951    else()
952        ExternalProject_Get_Property(panda_host_tools binary_dir)
953        set(IRTOC_TESTS_OBJ "${binary_dir}/irtoc/irtoc_tests/irtoc_tests.o")
954
955        SET_SOURCE_FILES_PROPERTIES(${IRTOC_TESTS_OBJ} PROPERTIES
956            EXTERNAL_OBJECT true
957            GENERATED true
958        )
959        # Due to cmake complain about absence of the irtoc file, we just fake it until it will be generated
960        file(MAKE_DIRECTORY ${binary_dir}/irtoc/irtoc_tests)
961        if (NOT EXISTS ${IRTOC_TESTS_OBJ})
962            file(TOUCH ${IRTOC_TESTS_OBJ})
963        endif()
964        set(irtoc_tests_target panda_host_tools-build)
965    endif()
966    # In Host tools mode we only generate Irtoc files for irtoc_tests, we shouldn't create irtoc_tests itself.
967    if (irtoc_tests_target AND NOT HOST_TOOLS)
968        add_gtests(
969            arkruntime_irtoc_tests
970            tests/irtoc_test.cpp
971            ${IRTOC_TESTS_OBJ}
972        )
973        add_dependencies(arkruntime_irtoc_tests ${irtoc_tests_target})
974    endif()
975endif()
976
977if (NOT PANDA_PRODUCT_BUILD)
978  add_gtests(
979    arkruntime_intrinsics_blacklist_test
980    tests/intrinsics_blacklist_test.cpp
981    )
982endif()
983
984if (TARGET arkruntime_test_interpreter_impl)
985    add_gtests(
986        arkruntime_interpreter_test
987        tests/c2i_bridge_test.cpp
988        tests/class_linker_test.cpp
989        tests/class_linker_test_extension.cpp
990        tests/exception_test.cpp
991        tests/interpreter/test_interpreter.cpp
992        tests/interpreter/test_runtime_interface.cpp
993        tests/interpreter_test.cpp
994        tests/interpreter_test_switch.cpp
995        tests/invokation_helper.cpp
996        $<TARGET_OBJECTS:arkruntime_test_interpreter_impl>
997        ${INVOKE_HELPER}
998    )
999endif()
1000
1001# In interpreter_test.cpp tests ResolveCtorClass and
1002# ResolveField are extremely slow (that lead to timeout in arm32 debug builds).
1003# To avoid timeout these tests were moved to special targets
1004# and code generation that needed in tests is made in build time
1005add_gtests(
1006    interpreter_test_resolve_field
1007    tests/interpreter_test_resolve_field.cpp
1008)
1009
1010add_gtests(
1011    interpreter_test_resolve_ctor_class
1012    tests/interpreter_test_resolve_ctor_class.cpp
1013)
1014
1015if (PANDA_WITH_TESTS)
1016    file(MAKE_DIRECTORY ${PANDA_BINARY_ROOT}/bin-gtests/pre-build)
1017
1018    function(generate_gtests_prebuild test_name)
1019        set(SOURCE_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/tests/templates/${test_name}.pa.erb")
1020        set(GENERATED_OUTPUT "${PANDA_BINARY_ROOT}/bin-gtests/pre-build/${test_name}")
1021
1022        if(CMAKE_CROSSCOMPILING)
1023            ExternalProject_Get_Property(panda_host_tools binary_dir)
1024            set(assembler_target panda_host_tools-build)
1025            set(assembler_bin    "${binary_dir}/assembler/ark_asm")
1026        else()
1027            set(assembler_target ark_asm)
1028            set(assembler_bin    $<TARGET_FILE:${assembler_target}>)
1029        endif()
1030
1031        add_custom_command(OUTPUT ${GENERATED_OUTPUT}.abc
1032            COMMENT "Generating ${test_name}.abc"
1033            COMMAND erb ${SOURCE_TEMPLATE} > ${GENERATED_OUTPUT}.pa
1034            COMMAND ${assembler_bin} ${GENERATED_OUTPUT}.pa ${GENERATED_OUTPUT}.abc
1035            DEPENDS ${assembler_target}
1036        )
1037
1038        add_custom_target(${test_name}_abc
1039            DEPENDS ${GENERATED_OUTPUT}.abc
1040        )
1041
1042        add_dependencies(${test_name}_gtests ${test_name}_abc)
1043    endfunction()
1044
1045    generate_gtests_prebuild(interpreter_test_resolve_field)
1046    generate_gtests_prebuild(interpreter_test_resolve_ctor_class)
1047endif()
1048
1049add_gtests(
1050    arkruntime_utils_test
1051    tests/class_size_test.cpp
1052    tests/debugger_test.cpp
1053    tests/frame_test.cpp
1054    tests/i2c_bridge_test.cpp
1055    tests/math_helpers_test.cpp
1056    tests/stack_walker_test.cpp
1057    tests/time_utils_test.cpp
1058    ${INVOKE_HELPER}
1059    ${PANDA_ROOT}/compiler/tests/panda_runner.cpp
1060    $<TARGET_OBJECTS:arkruntime_stack_walker_obj>
1061)
1062
1063include(intrinsics.cmake)
1064include(icu.cmake)
1065
1066add_subdirectory(tooling/inspector)
1067
1068if(PANDA_WITH_TESTS)
1069    add_subdirectory(tests/tooling)
1070endif()
1071
1072add_subdirectory(profiling)
1073
1074panda_add_sanitizers(TARGET arkruntime_obj SANITIZERS ${PANDA_SANITIZERS_LIST})
1075panda_add_sanitizers(TARGET arkruntime_interpreter_impl SANITIZERS ${PANDA_SANITIZERS_LIST})
1076if(PANDA_WITH_TESTS AND TARGET arkruntime_test_interpreter_impl)
1077    panda_add_sanitizers(TARGET arkruntime_test_interpreter_impl SANITIZERS ${PANDA_SANITIZERS_LIST})
1078endif()
1079