• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021-2022 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/pt_thread.cpp
33    tooling/debug_inf.cpp
34    field.cpp
35    gc_task.cpp
36    dprofiler/dprofiler.cpp
37    interpreter/interpreter.cpp
38    interpreter/runtime_interface.cpp
39    intrinsics.cpp
40    coretypes/string.cpp
41    coretypes/array.cpp
42    class.cpp
43    class_helper.cpp
44    locks.cpp
45    panda_vm.cpp
46    language_context.cpp
47    mem/gc/epsilon/epsilon.cpp
48    mem/gc/epsilon/epsilon_barrier.cpp
49    mem/gc/gc.cpp
50    mem/gc/gc_adaptive_stack.cpp
51    mem/gc/gc_settings.cpp
52    mem/gc/lang/gc_lang.cpp
53    mem/gc/gc_queue.cpp
54    mem/gc/gc_root.cpp
55    mem/gc/gc_root_type.cpp
56    mem/gc/gc_stats.cpp
57    mem/gc/gc_trigger.cpp
58    mem/gc/gc-hung/gc_hung.cpp
59    mem/gc/card_table.cpp
60    mem/gc/heap-space-misc/crossing_map.cpp
61    mem/gc/heap-space-misc/crossing_map_singleton.cpp
62    mem/gc/bitmap.cpp
63    mem/gc/gc_scope.cpp
64    mem/gc/gc_scoped_phase.cpp
65    mem/gc/gc_workers_thread_pool.cpp
66    mem/gc/stw-gc/stw-gc.cpp
67    mem/gc/gc_barrier_set.cpp
68    mem/gc/gen-gc/gen-gc.cpp
69    mem/gc/hybrid-gc/hybrid_object_allocator.cpp
70    mem/refstorage/ref_block.cpp
71    mem/refstorage/reference_storage.cpp
72    mem/refstorage/global_object_storage.cpp
73    mem/allocator.cpp
74    mem/tlab.cpp
75    mem/heap_manager.cpp
76    mem/heap_verifier.cpp
77    mem/rendezvous.cpp
78    mem/runslots.cpp
79    mem/region_space.cpp
80    mem/object_helpers.cpp
81    mem/mem_stats_additional_info.cpp
82    mem/mem_stats_default.cpp
83    mem/mem_stats.cpp
84    mem/internal_allocator.cpp
85    mem/panda_string.cpp
86    mem/memory_manager.cpp
87    mem/heap_space.cpp
88    methodtrace/trace.cpp
89    mark_word.cpp
90    method.cpp
91    monitor.cpp
92    monitor_object_lock.cpp
93    monitor_pool.cpp
94    global_object_lock.cpp
95    object_header.cpp
96    runtime.cpp
97    runtime_controller.cpp
98    string_table.cpp
99    thread.cpp
100    thread_manager.cpp
101    lock_order_graph.cpp
102    time_utils.cpp
103    timing.cpp
104    compiler.cpp
105    vtable_builder.cpp
106    imtable_builder.cpp
107    cframe.cpp
108    stack_walker.cpp
109    deoptimization.cpp
110    object_accessor.cpp
111    osr.cpp
112    arch/asm_support.cpp
113    cha.cpp
114    runtime_helpers.cpp
115    handle_scope.cpp
116    file_manager.cpp
117    mem/gc/generational-gc-base.cpp
118    mem/gc/g1/g1-gc.cpp
119    mem/gc/g1/g1-allocator.cpp
120    plugins.cpp
121    mem/gc/g1/update_remset_thread.cpp
122    relayout_profiler.cpp
123    loadable_agent.cpp
124)
125
126if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
127    list(APPEND SOURCES
128        bridge/arch/arm/interpreter_to_compiled_code_bridge_arm.S
129        bridge/arch/arm/compiled_code_to_interpreter_bridge_arm.S
130        bridge/arch/arm/compiled_code_to_interpreter_bridge_dyn_arm.S
131        bridge/arch/arm/interpreter_to_compiled_code_bridge_dyn_arm.S
132        bridge/arch/arm/compiled_code_to_runtime_bridge_arm.S
133        bridge/arch/arm/deoptimization_arm.S
134        arch/arm/osr_arm.S
135        arch/arm/interpreter_support.S)
136elseif (PANDA_TARGET_ARM32_ABI_HARD)
137    list(APPEND SOURCES
138        bridge/arch/arm/interpreter_to_compiled_code_bridge_armhf.S
139        bridge/arch/arm/compiled_code_to_interpreter_bridge_armhf.S
140        bridge/arch/arm/compiled_code_to_interpreter_bridge_dyn_arm.S
141        bridge/arch/arm/interpreter_to_compiled_code_bridge_dyn_arm.S
142        bridge/arch/arm/compiled_code_to_runtime_bridge_arm.S
143        bridge/arch/arm/deoptimization_arm.S
144        arch/arm/osr_arm.S
145        arch/arm/interpreter_support.S)
146elseif(PANDA_TARGET_ARM64)
147    list(APPEND SOURCES
148        bridge/arch/aarch64/interpreter_to_compiled_code_bridge_aarch64.S
149        bridge/arch/aarch64/compiled_code_to_interpreter_bridge_aarch64.S
150        bridge/arch/aarch64/compiled_code_to_interpreter_bridge_dyn_aarch64.S
151        bridge/arch/aarch64/interpreter_to_compiled_code_bridge_dyn_aarch64.S
152        bridge/arch/aarch64/compiled_code_to_runtime_bridge_aarch64.S
153        bridge/arch/aarch64/deoptimization_aarch64.S
154        arch/aarch64/osr_aarch64.S
155        arch/aarch64/interpreter_support.S
156        tests/arch/aarch64/stack_walker_test_bridge_aarch64.S)
157elseif(PANDA_TARGET_X86)
158    list(APPEND SOURCES
159        bridge/arch/x86/interpreter_to_compiled_code_bridge_x86.S
160        bridge/arch/x86/compiled_code_to_interpreter_bridge_x86.S
161        bridge/arch/x86/deoptimization_x86.S
162        arch/x86/osr_x86.S
163        arch/x86/interpreter_support.S)
164elseif(PANDA_TARGET_AMD64)
165    list(APPEND SOURCES
166        bridge/arch/amd64/compiled_code_to_interpreter_bridge_amd64.S
167        bridge/arch/amd64/compiled_code_to_interpreter_bridge_dyn_amd64.S
168        bridge/arch/amd64/interpreter_to_compiled_code_bridge_amd64.S
169        bridge/arch/amd64/interpreter_to_compiled_code_bridge_dyn_amd64.S
170        bridge/arch/amd64/compiled_code_to_runtime_bridge_amd64.S
171        bridge/arch/amd64/deoptimization_amd64.S
172        arch/amd64/common_amd64.S
173        arch/amd64/osr_amd64.S
174        arch/amd64/interpreter_support.S)
175endif()
176
177if (NOT PANDA_TARGET_MOBILE_WITH_NATIVE_LIBS)
178    list(APPEND SOURCES ${PANDA_ROOT}/platforms/common/runtime/thread.cpp)
179endif()
180
181if (NOT PANDA_TARGET_MOBILE)
182    list(APPEND SOURCES ${PANDA_ROOT}/platforms/common/runtime/verify_app_install.cpp)
183endif()
184
185set(INTERPRETER_IMPL_SOURCES
186    interpreter/interpreter_impl.cpp
187)
188
189add_library(arkruntime_interpreter_impl OBJECT ${INTERPRETER_IMPL_SOURCES})
190panda_set_lib_32bit_property(arkruntime_interpreter_impl)
191
192if (PANDA_WITH_ECMASCRIPT)
193    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/js_locale.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
194    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/js_date_time_format.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
195    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/js_relative_time_format.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
196    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/js_number_format.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
197    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/global_env.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
198    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/ecma_vm.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
199
200    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/mem/verification.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
201    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/mem/semi_space_collector.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
202
203    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/snapshot/mem/snapshot_serialize.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
204
205    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
206    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_string.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
207    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_locale.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
208    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_intl.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
209    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_number_format.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
210    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_number.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
211    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_relative_time_format.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
212    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_date.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
213    set_source_files_properties(${PANDA_ECMASCRIPT_PLUGIN_SOURCE}/runtime/builtins/builtins_date_time_format.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
214endif()
215
216set(ISA_TEMPLATES
217    interpreter-inl_gen.h.erb
218    isa_constants_gen.h.erb
219    unimplemented_handlers-inl.h.erb
220    irtoc_interpreter_utils.h.erb
221    debug_test_interpreter-inl_gen.cpp.erb
222)
223
224set(GEN_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
225file(MAKE_DIRECTORY ${GEN_INCLUDE_DIR})
226panda_isa_gen(
227    TEMPLATES ${ISA_TEMPLATES}
228    SOURCE ${CMAKE_CURRENT_LIST_DIR}/interpreter/templates
229    DESTINATION ${GEN_INCLUDE_DIR}
230)
231
232set(ISA "${CMAKE_BINARY_DIR}/isa/isa.yaml")
233set(ISA_API "${PANDA_ROOT}/isa/isapi.rb")
234set(BRIDGE_DISPATCH_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/templates/bridge_dispatch.S.erb")
235set(BRIDGE_DISPATCH_DYN_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/templates/bridge_dispatch_dyn.S.erb")
236set(BRIDGE_ARCHS aarch64 arm armhf amd64 x86)
237foreach(arch ${BRIDGE_ARCHS})
238    panda_gen_file(
239        DATAFILE ${ISA}
240        TEMPLATE ${BRIDGE_DISPATCH_TEMPLATE}
241        OUTPUTFILE ${GEN_INCLUDE_DIR}/bridge_dispatch_${arch}.S
242        REQUIRES ${ISA_API} ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_${arch}.rb
243                            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_common.rb
244                            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_static.rb
245    )
246    add_custom_target(bridge_dispatch_${arch} DEPENDS ${GEN_INCLUDE_DIR}/bridge_dispatch_${arch}.S ${ISA})
247    add_dependencies(bridge_dispatch_${arch} isa_assert)
248
249    panda_gen_file(
250        DATAFILE ${ISA}
251        TEMPLATE ${BRIDGE_DISPATCH_DYN_TEMPLATE}
252        OUTPUTFILE ${GEN_INCLUDE_DIR}/bridge_dispatch_dyn_${arch}.S
253        REQUIRES ${ISA_API} ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_${arch}.rb
254                            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_common.rb
255                            ${CMAKE_CURRENT_LIST_DIR}/templates/bridge_helpers_dynamic.rb
256    )
257    add_custom_target(bridge_dispatch_dyn_${arch} DEPENDS ${GEN_INCLUDE_DIR}/bridge_dispatch_dyn_${arch}.S ${ISA})
258    add_dependencies(bridge_dispatch_${arch} isa_assert)
259
260endforeach()
261
262set(GENERATOR ${PANDA_ROOT}/libpandafile/types.rb)
263set(TEMPLATE ${CMAKE_CURRENT_LIST_DIR}/templates/shorty_values.h.erb)
264set(DATAFILE ${PANDA_ROOT}/libpandafile/types.yaml)
265set(DEPENDENCIES ${GENERATOR} ${TEMPLATE} ${DATAFILE})
266set(OUTFILE "${CMAKE_CURRENT_BINARY_DIR}/include/shorty_values.h")
267add_custom_command(OUTPUT "${OUTFILE}"
268                   COMMENT "Generate shorty_values.h"
269                   COMMAND ${PANDA_ROOT}/isa/gen.rb -d ${DATAFILE} -t ${TEMPLATE} -o "${OUTFILE}" -r ${GENERATOR}
270                   DEPENDS ${DEPENDENCIES})
271add_custom_target(shorty_values_gen_${PROJECT_NAME} ALL DEPENDS "${OUTFILE}")
272
273target_compile_options(arkruntime_interpreter_impl PUBLIC -Wno-invalid-offsetof)
274
275set_property(TARGET arkruntime_interpreter_impl PROPERTY POSITION_INDEPENDENT_CODE ON)
276
277if (PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES)
278    if (PANDA_TARGET_ARM64)
279        target_compile_options(arkruntime_interpreter_impl PUBLIC -ffixed-x20 -ffixed-x21 -ffixed-x22 -ffixed-x23 -ffixed-x24 -ffixed-x25 -ffixed-x28)
280        target_compile_definitions(arkruntime_interpreter_impl PUBLIC FFIXED_REGISTERS)
281    endif()
282
283    # Temporary disable clang tidy as it cannot recognize -ffixed-<reg> params that we used. Should be fixed in clang tidy 9
284    set_target_properties(arkruntime_interpreter_impl PROPERTIES CXX_CLANG_TIDY "")
285endif()
286
287target_include_directories(arkruntime_interpreter_impl
288    PRIVATE "$<TARGET_PROPERTY:c_secshared,INCLUDE_DIRECTORIES>"
289    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
290    PUBLIC ${PANDA_ROOT}
291    PUBLIC ${GEN_INCLUDE_DIR}
292    PUBLIC ${PANDA_ROOT}/compiler
293    PUBLIC ${PANDA_ROOT}/libpandabase
294    PUBLIC ${PANDA_ROOT}/libpandafile
295    PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options
296    PUBLIC ${PANDA_BINARY_ROOT}
297    PUBLIC ${PANDA_BINARY_ROOT}/libpandafile/include
298    PUBLIC ${PANDA_BINARY_ROOT}/libpandabase/generated
299    PUBLIC ${VERIFIER_INCLUDE_DIR}
300    PUBLIC ${PANDA_BINARY_ROOT}
301)
302
303add_dependencies(arkruntime_interpreter_impl
304    isa_gen_${PROJECT_NAME}
305    ${PROJECT_NAME}_static_options
306    intrinsics_gen_${PROJECT_NAME}
307    shorty_values_gen_${PROJECT_NAME}
308    arkbase
309    arkfile
310    entrypoints_gen
311)
312
313add_dependencies(arkcompiler entrypoints_gen entrypoints_compiler_checksum_gen)
314
315if(NOT (CMAKE_CROSSCOMPILING OR PANDA_TARGET_OHOS))
316    irtoc_compile(TARGET_NAME irtoc_fastpath
317                  INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/resolvers.irt
318                              ${IRTOC_SOURCE_DIR}/scripts/allocation.irt
319                              ${IRTOC_SOURCE_DIR}/scripts/monitors.irt
320                              ${IRTOC_SOURCE_DIR}/scripts/check_cast.irt
321                  TARGET_VARIABLE IRTOC_FASTPATH_OBJ)
322
323    irtoc_compile(TARGET_NAME irtoc_interpreter
324                  INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/interpreter.irt
325                  TARGET_VARIABLE IRTOC_INTERPRETER_OBJ)
326    set(irtoc_fastpath_target irtoc_fastpath)
327    set(irtoc_interpreter_target irtoc_interpreter)
328else()
329    ExternalProject_Get_Property(panda_host_tools binary_dir)
330    set(IRTOC_FASTPATH_OBJ "${binary_dir}/irtoc/irtoc_fastpath/irtoc_fastpath.o")
331    set(IRTOC_INTERPRETER_OBJ "${binary_dir}/irtoc/irtoc_interpreter/irtoc_interpreter.o")
332
333    SET_SOURCE_FILES_PROPERTIES(${IRTOC_FASTPATH_OBJ} PROPERTIES
334        EXTERNAL_OBJECT true
335        GENERATED true
336    )
337    SET_SOURCE_FILES_PROPERTIES(${IRTOC_INTERPRETER_OBJ} PROPERTIES
338        EXTERNAL_OBJECT true
339        GENERATED true
340    )
341    # Due to cmake complain about absence of the irtoc file, we just fake it until it will be generated
342    execute_process(COMMAND mkdir -p ${binary_dir}/irtoc/irtoc_fastpath)
343    execute_process(COMMAND touch ${IRTOC_FASTPATH_OBJ})
344    execute_process(COMMAND mkdir -p ${binary_dir}/irtoc/irtoc_interpreter)
345    execute_process(COMMAND touch ${IRTOC_INTERPRETER_OBJ})
346    set(irtoc_fastpath_target build_host_tools)
347    set(irtoc_interpreter_target build_host_tools)
348endif()
349
350set(ARKRUNTIME_SOURCES
351    ${IRTOC_FASTPATH_OBJ}
352    ${IRTOC_INTERPRETER_OBJ}
353    ${SOURCES}
354    ${CORE_VM_SOURCES}
355    ${VERIFIER_SOURCES}
356)
357
358add_library(arkruntime_static STATIC
359    ${ARKRUNTIME_SOURCES}
360    $<TARGET_OBJECTS:arkruntime_interpreter_impl>
361)
362set_property(TARGET arkruntime_static PROPERTY POSITION_INDEPENDENT_CODE ON)
363
364add_library(arkruntime SHARED $<TARGET_OBJECTS:arkruntime_interpreter_impl> runtime_helpers.cpp)
365target_link_libraries(arkruntime arkruntime_static)
366
367add_subdirectory(scheduler)
368
369
370panda_add_to_clang_tidy(TARGET arkruntime_static)
371panda_add_to_clang_tidy(TARGET arkruntime)
372
373add_subdirectory(asm_defines)
374
375add_dependencies(arkruntime_static
376    intrinsics_gen_${PROJECT_NAME}
377    isa_gen_pandaverification
378    messages_gen_pandaverification
379    arkstdlib
380    asm_defines_generator
381    entrypoints_gen
382    ${irtoc_fastpath_target}
383    ${irtoc_interpreter_target}
384)
385
386if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
387    add_dependencies(arkruntime_static bridge_dispatch_arm bridge_dispatch_dyn_arm)
388elseif (PANDA_TARGET_ARM32_ABI_HARD)
389    add_dependencies(arkruntime_static bridge_dispatch_armhf bridge_dispatch_dyn_arm)
390elseif(PANDA_TARGET_ARM64)
391    add_dependencies(arkruntime_static bridge_dispatch_aarch64 bridge_dispatch_dyn_aarch64)
392elseif(PANDA_TARGET_X86)
393    add_dependencies(arkruntime_static bridge_dispatch_x86)
394elseif(PANDA_TARGET_AMD64)
395    add_dependencies(arkruntime_static bridge_dispatch_amd64 bridge_dispatch_dyn_amd64)
396endif()
397
398target_include_directories(arkruntime_static
399    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
400    PUBLIC ${PANDA_ROOT}
401    PUBLIC ${PANDA_BINARY_ROOT}
402    PUBLIC ${PANDA_BINARY_ROOT}/runtime/asm_defines
403    PUBLIC ${GEN_INCLUDE_DIR}
404    PUBLIC ${VERIFIER_INCLUDE_DIR}
405)
406
407target_link_libraries(arkruntime_static arkbase arkfile arkcompiler dprof arkaotmanager)
408if (NOT PANDA_TARGET_OHOS)
409  target_link_libraries(arkruntime_static atomic)
410endif()
411
412set(CSA_TESTS_ARKRUNTIME_PATH ${GEN_INCLUDE_DIR}/debug_test_interpreter-inl_gen.cpp)
413add_library(csa_tests_arkruntime_interpreter_impl OBJECT EXCLUDE_FROM_ALL ${CSA_TESTS_ARKRUNTIME_PATH})
414target_include_directories(csa_tests_arkruntime_interpreter_impl
415    PRIVATE "$<TARGET_PROPERTY:c_secshared,INCLUDE_DIRECTORIES>"
416    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
417    PUBLIC ${PANDA_ROOT}
418    PUBLIC ${GEN_INCLUDE_DIR}
419    PUBLIC ${PANDA_ROOT}/compiler
420    PUBLIC ${PANDA_ROOT}/libpandabase
421    PUBLIC ${PANDA_ROOT}/libpandafile
422    PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options
423    PUBLIC ${PANDA_BINARY_ROOT}
424    PUBLIC ${PANDA_BINARY_ROOT}/compiler/generated
425    PUBLIC ${PANDA_BINARY_ROOT}/libpandafile/include
426    PUBLIC ${PANDA_BINARY_ROOT}/libpandabase/generated
427    PUBLIC ${VERIFIER_INCLUDE_DIR}
428    PUBLIC ${PANDA_BINARY_ROOT}
429)
430add_dependencies(csa_tests_arkruntime_interpreter_impl arkruntime_static)
431
432# Runtime uses CodeInfo from the compiler. Maybe in the future CodeInfo
433# will be moved to another place, then this line should be removed.
434target_include_directories(arkruntime_static PUBLIC ${PANDA_ROOT}/compiler)
435
436# Disable warning about offsetof usage for non-standard layout types.
437# In C++17 offsetof is conditionally implemented for such types, so
438# compiler should issue error if it doesn't implemented offsetof for
439# them. Also we use static asserts to ensure that offsetof works correcly
440# for non-standard layout types.
441target_compile_options(arkruntime_static PUBLIC -Wno-invalid-offsetof)
442
443#Build PANDA_QEMU_AARCH64_GCC_8 hangs for target arkruntime_test_interpreter_impl. It is compiler issue.
444if(PANDA_WITH_TESTS AND NOT PANDA_QEMU_AARCH64_GCC_8)
445  set(TEST_INTERPRETER_IMPL_SOURCES
446    tests/interpreter/test_interpreter_impl.cpp
447    )
448
449  add_library(arkruntime_test_interpreter_impl OBJECT ${TEST_INTERPRETER_IMPL_SOURCES})
450
451  target_compile_options(arkruntime_test_interpreter_impl PUBLIC -Wno-invalid-offsetof)
452  panda_set_lib_32bit_property(arkruntime_test_interpreter_impl)
453
454  if (PANDA_ENABLE_GLOBAL_REGISTER_VARIABLES)
455    if (PANDA_TARGET_ARM64)
456      target_compile_options(arkruntime_test_interpreter_impl PUBLIC -ffixed-x20 -ffixed-x21 -ffixed-x22 -ffixed-x23 -ffixed-x24 -ffixed-x25 -ffixed-x28)
457      target_compile_definitions(arkruntime_test_interpreter_impl PUBLIC FFIXED_REGISTERS)
458    endif()
459
460    # Temporary disable clang tidy as it cannot recognize -ffixed-<reg> params that we used. Should be fixed in clang tidy 9
461    set_target_properties(arkruntime_test_interpreter_impl PROPERTIES CXX_CLANG_TIDY "")
462  endif()
463
464  target_include_directories(arkruntime_test_interpreter_impl
465    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
466    PUBLIC ${PANDA_ROOT}
467    PUBLIC ${GEN_INCLUDE_DIR}
468    PUBLIC ${PANDA_ROOT}/compiler
469    PUBLIC ${PANDA_ROOT}/libpandabase
470    PUBLIC ${PANDA_ROOT}/libpandafile
471    PUBLIC ${PANDA_BINARY_ROOT}/panda_gen_options
472    PUBLIC ${PANDA_BINARY_ROOT}/libpandafile/include
473    PUBLIC ${PANDA_BINARY_ROOT}
474    PUBLIC "$<TARGET_PROPERTY:c_secshared,INCLUDE_DIRECTORIES>"
475    PUBLIC ${PANDA_BINARY_ROOT}/libpandabase/generated
476    PUBLIC ${VERIFIER_INCLUDE_DIR}
477    )
478  if (PANDA_WITH_TESTS)
479      target_include_directories(arkruntime_test_interpreter_impl
480          PUBLIC "$<TARGET_PROPERTY:gtest,INCLUDE_DIRECTORIES>")
481  endif()
482
483
484  add_dependencies(arkruntime_test_interpreter_impl
485    isa_gen_${PROJECT_NAME}
486    intrinsics_gen_${PROJECT_NAME}
487    ${PROJECT_NAME}_static_options
488    arkbase
489    arkfile
490    entrypoints_gen
491    )
492
493  if(PANDA_TARGET_ARM32_ABI_SOFT OR PANDA_TARGET_ARM32_ABI_SOFTFP)
494    SET(INVOKE_HELPER tests/arch/arm/invokation_helper.S)
495  elseif (PANDA_TARGET_ARM32_ABI_HARD)
496    SET(INVOKE_HELPER tests/arch/arm/invokation_helper_hf.S)
497  elseif(PANDA_TARGET_ARM64)
498    SET(INVOKE_HELPER tests/arch/aarch64/invokation_helper.S)
499  elseif(PANDA_TARGET_X86)
500    #SET(INVOKE_HELPER tests/arch/x86/invokation_helper.S)
501  elseif(PANDA_TARGET_AMD64)
502    SET(INVOKE_HELPER tests/arch/amd64/invokation_helper.S)
503  endif()
504endif()
505
506function(add_gtests test_name)
507    panda_add_gtest(
508        NO_CORES
509        NAME ${test_name}
510        SOURCES
511            ${ARGN}
512        LIBRARIES
513            arkruntime
514            arkassembler
515        SANITIZERS
516            ${PANDA_SANITIZERS_LIST}
517    )
518
519    if(TARGET ${test_name})
520        target_include_directories(${test_name}
521            PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
522            PUBLIC ${PANDA_ROOT}
523            PRIVATE ${GEN_INCLUDE_DIR}
524        )
525        target_compile_options(${test_name} PUBLIC "-Wno-ignored-attributes")
526    endif()
527
528endfunction()
529
530function(add_multithread_gtests test_name)
531    panda_add_gtest(
532        NAME ${test_name}
533        SOURCES
534            ${ARGN}
535        LIBRARIES
536            arkruntime
537            arkassembler
538        SANITIZERS
539            ${PANDA_SANITIZERS_LIST}
540    )
541
542    if(TARGET ${test_name})
543        target_include_directories(${test_name}
544            PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
545            PUBLIC ${PANDA_ROOT}
546            PRIVATE ${GEN_INCLUDE_DIR}
547        )
548        target_compile_options(${test_name} PUBLIC "-Wno-ignored-attributes")
549    endif()
550
551endfunction()
552
553add_multithread_gtests (
554    arkruntime_multithreaded_test
555    tests/multithreaded_intern_string_table_test.cpp
556)
557
558add_gtests(
559    arkruntime_bitmap_ClearRange_test
560    tests/bitmap_clear_range_test.cpp
561)
562
563add_gtests(
564    arkruntime_bitmap_OrderObjectAlignment_test
565    tests/bitmap_order_object_alignment_test.cpp
566)
567
568add_gtests(
569    arkruntime_bitmap_VisitorObjectAlignment_test
570    tests/bitmap_visitor_object_alignment_test.cpp
571)
572
573add_gtests(
574    arkruntime_bitmap_PageAlignment_test
575    tests/bitmap_page_alignment_test.cpp
576)
577
578add_gtests(
579    arkruntime_core_layout_test
580    tests/array_test.cpp
581    tests/mark_word_test.cpp
582    tests/method_test.cpp
583    tests/compiler_thread_pool.cpp
584    tests/mock_queue_thread_pool.cpp
585    tests/string_table_base_test.h
586    tests/string_table_gc_test.cpp
587    tests/string_test.cpp
588    tests/compilation_status_test.cpp
589    tests/osr_code_test.cpp
590)
591
592add_gtests(
593    arkruntime_get_method_test
594    tests/getmethod_test.cpp
595)
596
597add_gtests(
598    arkruntime_memory_mem_leak_test
599    tests/mem_leak_test.cpp
600)
601
602add_gtests(
603    arkruntime_memory_statistic_test
604    tests/histogram_test.cpp
605    tests/mem_stats_additional_info_test.cpp
606    tests/mem_stats_gc_test.cpp
607    tests/mem_stats_gen_gc_test.cpp
608    tests/mem_stats_test.cpp
609)
610
611add_gtests(
612    arkruntime_memory_management_bump_allocator_test
613    tests/bump_allocator_test.cpp
614)
615
616add_gtests(
617    arkruntime_memory_management_frame_allocator_test
618    tests/frame_allocator_test.cpp
619)
620
621add_gtests(
622    arkruntime_memory_management_freelist_allocator_test
623    tests/freelist_allocator_test.cpp
624)
625
626add_gtests(
627    arkruntime_memory_management_humongous_obj_allocator_test
628    tests/humongous_obj_allocator_test.cpp
629)
630
631add_gtests(
632    arkruntime_memory_management_internal_allocator_test
633    tests/internal_allocator_test.cpp
634)
635
636add_gtests(
637    arkruntime_memory_management_malloc-proxy-allocator-test
638    tests/malloc-proxy-allocator-test.cpp
639)
640
641add_gtests(
642    arkruntime_memory_management_pygote_space_allocator_gen_test
643    tests/pygote_space_allocator_gen_test.cpp
644)
645
646add_gtests(
647    arkruntime_memory_management_pygote_space_allocator_stw_test
648    tests/pygote_space_allocator_stw_test.cpp
649)
650
651# TODO(agrebenkin) Enable the tests as soon as full gc doesn't require to maintain free young-space-size
652#add_gtests(
653#    arkruntime_memory_management_region_allocator_test
654#    tests/region_allocator_test.cpp
655#)
656
657add_gtests(
658    arkruntime_memory_management_rem_set_test
659    tests/rem_set_test.cpp
660)
661
662add_gtests(
663    arkruntime_memory_management_runslots_allocator_test
664    tests/runslots_allocator_test.cpp
665)
666
667add_gtests(
668    arkruntime_memory_management_test_2
669    tests/card_table_test.cpp
670    tests/crossing_map_test.cpp
671    tests/panda_smart_pointers_test.cpp
672    tests/panda_tl_containers_test.cpp
673    tests/tlab_test.cpp
674    tests/gc_task_test.cpp
675    tests/g1gc_test.cpp
676    tests/collection_set_test.cpp
677    tests/g1gc_fullgc_test.cpp
678    tests/object_helpers_test.cpp
679    tests/gc_log_test.cpp
680)
681
682add_gtests(
683    arkruntime_sa_object_helpers_test
684    tests/static_analyzer_test.cpp
685)
686
687add_gtests(
688    arkruntime_gc_trigger_test
689    tests/gc_trigger_test.cpp
690)
691
692add_gtests(
693    arkruntime_memory_management_heap_space_test
694    tests/heap_space_test.cpp
695)
696
697add_gtests(
698    arkruntime_multithreading_test
699    tests/compiler_queue_test.cpp
700    tests/monitor_test.cpp
701    tests/thread_test.cpp
702)
703
704add_gtests(
705    arkruntime_options_test
706    tests/options_test.cpp
707)
708
709# We run irtoc tests only in host mode, because irtoc tests are intended for testing only Irtoc language capabilities.
710if (PANDA_WITH_TESTS OR HOST_TOOLS)
711    if (NOT CMAKE_CROSSCOMPILING)
712        irtoc_compile(TARGET_NAME irtoc_tests
713            INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/tests.irt
714            TARGET_VARIABLE IRTOC_TESTS_OBJ)
715        set(irtoc_tests_target irtoc_tests)
716    else()
717        ExternalProject_Get_Property(panda_host_tools binary_dir)
718        set(IRTOC_TESTS_OBJ "${binary_dir}/irtoc/irtoc_tests/irtoc_tests.o")
719
720        SET_SOURCE_FILES_PROPERTIES(${IRTOC_TESTS_OBJ} PROPERTIES
721            EXTERNAL_OBJECT true
722            GENERATED true
723        )
724        # Due to cmake complain about absence of the irtoc file, we just fake it until it will be generated
725        execute_process(COMMAND mkdir -p ${binary_dir}/irtoc/irtoc_tests)
726        execute_process(COMMAND touch ${IRTOC_TESTS_OBJ})
727        set(irtoc_tests_target build_host_tools)
728    endif()
729    # In Host tools mode we only generate Irtoc files for irtoc_tests, we shouldn't create irtoc_tests itself.
730    if (irtoc_tests_target AND NOT HOST_TOOLS)
731        add_gtests(
732            arkruntime_irtoc_tests
733            tests/irtoc_test.cpp
734            ${IRTOC_TESTS_OBJ}
735        )
736        add_dependencies(arkruntime_irtoc_tests ${irtoc_tests_target})
737    endif()
738endif()
739
740if (NOT PANDA_PRODUCT_BUILD)
741  add_gtests(
742    arkruntime_intrinsics_blacklist_test
743    tests/intrinsics_blacklist_test.cpp
744    )
745endif()
746
747if (TARGET arkruntime_test_interpreter_impl)
748    add_gtests(
749        arkruntime_interpreter_test
750        tests/c2i_bridge_test.cpp
751        tests/class_linker_test.cpp
752        tests/class_linker_test_extension.cpp
753        tests/exception_test.cpp
754        tests/hybrid_object_allocator_test.cpp
755        tests/interpreter/test_interpreter.cpp
756        tests/interpreter/test_runtime_interface.cpp
757        tests/interpreter_test.cpp
758        tests/invokation_helper.cpp
759        $<TARGET_OBJECTS:arkruntime_test_interpreter_impl>
760        ${INVOKE_HELPER}
761    )
762endif()
763
764# In interpreter_test.cpp tests ResolveCtorClass and
765# ResolveField are extremely slow (that lead to timeout in arm32 debug builds).
766# To avoid timeout these tests were moved to special targets
767# and code generation that needed in tests is made in build time
768add_gtests(
769    interpreter_test_resolve_field
770    tests/interpreter_test_resolve_field.cpp
771)
772
773add_gtests(
774    interpreter_test_resolve_ctor_class
775    tests/interpreter_test_resolve_ctor_class.cpp
776)
777
778if (PANDA_WITH_TESTS)
779    file(MAKE_DIRECTORY ${PANDA_BINARY_ROOT}/bin-gtests/pre-build)
780
781    function(generate_gtests_prebuild test_name)
782        set(SOURCE_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/tests/templates/${test_name}.pa.erb")
783        set(GENERATED_OUTPUT "${PANDA_BINARY_ROOT}/bin-gtests/pre-build/${test_name}")
784
785        if(CMAKE_CROSSCOMPILING)
786            ExternalProject_Get_Property(panda_host_tools binary_dir)
787            set(assembler_target panda_host_tools)
788            set(assembler_bin    "${binary_dir}/assembler/ark_asm")
789        else()
790            set(assembler_target ark_asm)
791            set(assembler_bin    $<TARGET_FILE:${assembler_target}>)
792        endif()
793
794        add_custom_command(OUTPUT ${GENERATED_OUTPUT}.abc
795            COMMENT "Generating ${test_name}.abc"
796            COMMAND erb ${SOURCE_TEMPLATE} > ${GENERATED_OUTPUT}.pa
797            COMMAND ${assembler_bin} ${GENERATED_OUTPUT}.pa ${GENERATED_OUTPUT}.abc
798            DEPENDS ${assembler_target}
799        )
800
801        add_custom_target(${test_name}_abc
802            DEPENDS ${GENERATED_OUTPUT}.abc
803        )
804
805        add_dependencies(${test_name}_gtests ${test_name}_abc)
806    endfunction()
807
808    generate_gtests_prebuild(interpreter_test_resolve_field)
809    generate_gtests_prebuild(interpreter_test_resolve_ctor_class)
810endif()
811
812add_gtests(
813    arkruntime_utils_test
814    tests/class_size_test.cpp
815    tests/debugger_test.cpp
816    tests/frame_test.cpp
817    tests/i2c_bridge_test.cpp
818    tests/math_helpers_test.cpp
819    tests/stack_walker_test.cpp
820    tests/time_utils_test.cpp
821)
822
823include(intrinsics.cmake)
824
825add_subdirectory(tooling/inspector)
826
827if(PANDA_WITH_TESTS)
828    add_subdirectory(tests/tooling)
829endif()
830
831panda_add_sanitizers(TARGET arkruntime SANITIZERS ${PANDA_SANITIZERS_LIST})
832panda_add_sanitizers(TARGET arkruntime_static SANITIZERS ${PANDA_SANITIZERS_LIST})
833panda_add_sanitizers(TARGET arkruntime_interpreter_impl SANITIZERS ${PANDA_SANITIZERS_LIST})
834if(PANDA_WITH_TESTS AND TARGET arkruntime_test_interpreter_impl)
835    panda_add_sanitizers(TARGET arkruntime_test_interpreter_impl SANITIZERS ${PANDA_SANITIZERS_LIST})
836endif()
837add_check_style(".")
838