• 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
14project(compiler)
15
16include(cmake/coverage.cmake)
17
18if(PANDA_COMPILER_ENABLE)
19    include(cmake/benchmark_coverage.cmake)
20    include(cmake/ir_builder_coverage.cmake)
21endif()
22
23include(cmake/target.cmake)
24
25include_directories(
26    .
27    ${PANDA_ROOT}
28)
29
30include_directories(AFTER ${PANDA_BINARY_ROOT}/cross_values)
31
32set(GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
33file(MAKE_DIRECTORY ${GENERATED_DIR})
34
35set(IRTOC_BUILDER_GEN ${GENERATED_DIR}/irtoc_builder.cpp)
36irtoc_generate(
37    TARGET irtoc_generate_inst_builder
38    IR_API ir-builder
39    INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/interpreter.irt
40    OUTPUT_FILE ${IRTOC_BUILDER_GEN}
41    WORKING_DIRECTORY ${IRTOC_BUILD_DIR}/inst_builder
42)
43
44add_dependencies(irtoc_generate_inst_builder asm_defines)
45
46set(IRTOC_IR_INLINE_GEN ${GENERATED_DIR}/irtoc_ir_inline.h)
47irtoc_generate(
48    TARGET irtoc_generate_ir_inline
49    IR_API ir-inline
50    INPUT_FILES ${IRTOC_SOURCE_DIR}/scripts/interpreter.irt
51    OUTPUT_FILE ${IRTOC_IR_INLINE_GEN}
52    WORKING_DIRECTORY ${IRTOC_BUILD_DIR}/ir_inline
53)
54add_dependencies(irtoc_generate_ir_inline asm_defines)
55
56set(COMPILER_TEMPLATES_DIR ${CMAKE_CURRENT_LIST_DIR}/optimizer/templates)
57
58add_custom_target(inst_templates_gen)
59set_target_properties(inst_templates_gen PROPERTIES INST_TEMPLATES_YAML_FILES ${CMAKE_CURRENT_LIST_DIR}/optimizer/ir_builder/inst_templates.yaml)
60set(INST_TEMPLATES_GEN_YAML ${GENERATED_DIR}/inst_templates.yaml)
61set_target_properties(inst_templates_gen PROPERTIES INST_TEMPLATES_GEN_YAML ${INST_TEMPLATES_GEN_YAML})
62
63function(add_inst_templates YAML_FILE_PATH)
64    get_target_property(YAML_FILES inst_templates_gen INST_TEMPLATES_YAML_FILES)
65    list(APPEND YAML_FILES ${YAML_FILE_PATH})
66    set_target_properties(inst_templates_gen PROPERTIES INST_TEMPLATES_YAML_FILES "${YAML_FILES}")
67endfunction()
68
69set(INST_BUILDER_GEN ${GENERATED_DIR}/inst_builder_gen.cpp)
70configure_file(${COMPILER_TEMPLATES_DIR}/inst_builder_gen.cpp.erb ${GENERATED_DIR}/inst_builder_gen.cpp.erb @ONLY)
71
72panda_isa_gen(
73        TEMPLATES
74            "inst_builder_gen.cpp.erb"
75        SOURCE ${GENERATED_DIR}
76        REQUIRES ${PANDA_ROOT}/assembler/asm_isapi.rb
77        DESTINATION ${GENERATED_DIR}
78        EXTRA_DEPENDENCIES inst_templates_merge
79        )
80
81panda_gen(DATA ${PANDA_BINARY_ROOT}/runtime/intrinsics.yaml
82        TEMPLATES
83            intrinsics_enum.inl.erb
84            get_intrinsics.inl.erb
85            entrypoints_bridge_asm_macro.inl.erb
86            intrinsics_ir_build.inl.erb
87            intrinsics_flags.inl.erb
88            get_intrinsics_names.inl.erb
89            generate_operations_intrinsic_inst.inl.erb
90            generate_operations_intrinsic_graph.inl.erb
91            intrinsic_codegen_test.inl.erb
92            intrinsic_flags_test.inl.erb
93            can_encode_builtin.inl.erb
94            intrinsics_codegen.inl.h.erb
95            intrinsics_codegen.inl.erb
96        SOURCE ${COMPILER_TEMPLATES_DIR}/intrinsics
97        DESTINATION ${GENERATED_DIR}
98        REQUIRES ${COMPILER_TEMPLATES_DIR}/intrinsics/compiler_intrinsics.rb
99        EXTRA_DEPENDENCIES arkruntime_gen_intrinsics_yaml
100        )
101
102panda_gen(DATA ${CMAKE_CURRENT_LIST_DIR}/optimizer/ir/instructions.yaml
103        TEMPLATES
104            opcodes.h.erb
105            arch_info_gen.h.erb
106            inst_checker_gen.h.erb
107            IR-instructions.md.erb
108            codegen_arm64_gen.inc.erb
109            deoptimize_elimination_call_visitors.inl.erb
110        SOURCE ${COMPILER_TEMPLATES_DIR}
111        DESTINATION ${GENERATED_DIR}
112        REQUIRES ${COMPILER_TEMPLATES_DIR}/instructions.rb
113        )
114
115set(COMPILER_OPTIONS_GEN_H ${GENERATED_DIR}/compiler_options_gen.h)
116panda_gen_file(
117    DATAFILE ${CMAKE_CURRENT_LIST_DIR}/compiler.yaml
118    TEMPLATE ${PANDA_ROOT}/templates/options/options.h.erb
119    OUTPUTFILE ${COMPILER_OPTIONS_GEN_H}
120    REQUIRES ${PANDA_ROOT}/templates/common.rb
121)
122add_custom_target(compiler_options_gen DEPENDS ${COMPILER_OPTIONS_GEN_H})
123
124set(COMPILER_EVENTS_GEN_H ${GENERATED_DIR}/compiler_events_gen.h)
125panda_gen_file(
126    DATAFILE ${CMAKE_CURRENT_LIST_DIR}/compiler.yaml
127    TEMPLATE ${PANDA_ROOT}/templates/events/events.h.erb
128    OUTPUTFILE ${COMPILER_EVENTS_GEN_H}
129    REQUIRES ${PANDA_ROOT}/templates/common.rb
130)
131add_custom_target(compiler_events_gen DEPENDS ${COMPILER_EVENTS_GEN_H})
132
133set(COMPILER_LOGGER_COMPONENTS_GEN_H ${GENERATED_DIR}/compiler_logger_components.inc)
134panda_gen_file(
135    DATAFILE ${CMAKE_CURRENT_LIST_DIR}/compiler.yaml
136    TEMPLATE ${PANDA_ROOT}/templates/logger_components/logger_components.inc.erb
137    OUTPUTFILE ${COMPILER_LOGGER_COMPONENTS_GEN_H}
138    REQUIRES ${PANDA_ROOT}/templates/common.rb
139)
140add_custom_target(compiler_logger_components_gen DEPENDS ${COMPILER_LOGGER_COMPONENTS_GEN_H})
141
142set(CPU_FEATURES_GEN_H ${GENERATED_DIR}/cpu_features.inc)
143panda_gen_file(
144    DATAFILE ${CMAKE_CURRENT_LIST_DIR}/compiler.yaml
145    TEMPLATE ${PANDA_ROOT}/templates/cpu_features.inc.erb
146    OUTPUTFILE ${CPU_FEATURES_GEN_H}
147    REQUIRES ${PANDA_ROOT}/templates/common.rb
148)
149add_custom_target(cpu_features_gen DEPENDS ${CPU_FEATURES_GEN_H})
150
151set(OPTIMIZER_SOURCES
152        optimizer/pass.cpp
153        optimizer/pass_manager.cpp
154        optimizer/pass_manager_statistics.cpp
155        optimizer/analysis/alias_analysis.cpp
156        optimizer/analysis/bounds_analysis.cpp
157        optimizer/analysis/countable_loop_parser.cpp
158        optimizer/analysis/dominators_tree.cpp
159        optimizer/analysis/linear_order.cpp
160        optimizer/analysis/liveness_analyzer.cpp
161        optimizer/analysis/liveness_use_table.cpp
162        optimizer/analysis/live_registers.cpp
163        optimizer/analysis/loop_analyzer.cpp
164        optimizer/analysis/monitor_analysis.cpp
165        optimizer/analysis/object_type_propagation.cpp
166        optimizer/analysis/rpo.cpp
167        optimizer/analysis/reg_alloc_verifier.cpp
168        optimizer/analysis/types_analysis.cpp
169        optimizer/ir/analysis.cpp
170        optimizer/ir/basicblock.cpp
171        optimizer/ir/dump.cpp
172        optimizer/ir/graph.cpp
173        optimizer/ir/inst.cpp
174        optimizer/ir/locations.cpp
175        optimizer/ir/visualizer_printer.cpp
176        optimizer/ir/graph_checker.cpp
177        optimizer/ir/graph_cloner.cpp
178        optimizer/optimizations/adjust_arefs.cpp
179        optimizer/optimizations/balance_expressions.cpp
180        optimizer/optimizations/branch_elimination.cpp
181        optimizer/optimizations/checks_elimination.cpp
182        optimizer/optimizations/code_sink.cpp
183        optimizer/optimizations/const_folding.cpp
184        optimizer/optimizations/deoptimize_elimination.cpp
185        optimizer/optimizations/cleanup.cpp
186        optimizer/optimizations/if_conversion.cpp
187        optimizer/optimizations/licm.cpp
188        optimizer/optimizations/locations_builder.cpp
189        optimizer/optimizations/loop_peeling.cpp
190        optimizer/optimizations/loop_unroll.cpp
191        optimizer/optimizations/lse.cpp
192        optimizer/optimizations/memory_barriers.cpp
193        optimizer/optimizations/memory_coalescing.cpp
194        optimizer/optimizations/object_type_check_elimination.cpp
195        optimizer/optimizations/peepholes.cpp
196        optimizer/optimizations/redundant_loop_elimination.cpp
197        optimizer/optimizations/scheduler.cpp
198        optimizer/optimizations/try_catch_resolving.cpp
199        optimizer/optimizations/types_resolving.cpp
200        optimizer/optimizations/vn.cpp
201        optimizer/optimizations/cse.cpp
202        tools/debug/jit_writer.cpp
203        compiler_logger.cpp
204        compiler_options.cpp
205)
206set(COMPILER_SOURCES
207        optimizer/ir/aot_data.cpp
208        optimizer/ir_builder/ir_builder.cpp
209        optimizer/ir_builder/inst_builder.cpp
210        optimizer/optimizations/inlining.cpp
211        optimizer/optimizations/lowering.cpp
212        optimizer/optimizations/move_constants.cpp
213        optimizer/optimizations/regalloc/reg_alloc_base.cpp
214        optimizer/optimizations/regalloc/interference_graph.cpp
215        optimizer/optimizations/regalloc/reg_alloc.cpp
216        optimizer/optimizations/regalloc/reg_alloc_stat.cpp
217        optimizer/optimizations/regalloc/reg_alloc_graph_coloring.cpp
218        optimizer/optimizations/regalloc/reg_map.cpp
219        optimizer/optimizations/regalloc/reg_alloc_linear_scan.cpp
220        optimizer/optimizations/regalloc/spill_fills_resolver.cpp
221        optimizer/optimizations/regalloc/split_resolver.cpp
222        optimizer/optimizations/regalloc/reg_alloc_resolver.cpp
223        ${OPTIMIZER_SOURCES}
224        ${INST_BUILDER_GEN}
225        ${IRTOC_IR_INLINE_GEN}
226)
227if (NOT PANDA_TARGET_WINDOWS AND NOT PANDA_TARGET_MACOS)
228    list(APPEND COMPILER_SOURCES
229        compile_method.cpp
230        optimizer_run.cpp
231        optimizer/code_generator/disassembly.cpp
232        optimizer/code_generator/codegen.cpp
233        optimizer/code_generator/codegen_native.cpp
234        optimizer/code_generator/spill_fill_encoder.cpp
235        optimizer/code_generator/slow_path.cpp
236        optimizer/code_generator/method_properties.cpp
237        code_info/code_info.cpp
238        code_info/code_info_builder.cpp
239    )
240endif()
241
242add_library(arkcompiler ${PANDA_DEFAULT_LIB_TYPE} ${COMPILER_SOURCES})
243
244panda_add_to_clang_tidy(TARGET arkcompiler)
245
246add_dependencies(arkcompiler isa_gen_${PROJECT_NAME})
247add_dependencies(arkcompiler instructions_gen_${PROJECT_NAME})
248add_dependencies(arkcompiler compiler_events_gen)
249add_dependencies(arkcompiler compiler_logger_components_gen)
250add_dependencies(arkcompiler compiler_options_gen)
251add_dependencies(arkcompiler irtoc_generate_inst_builder)
252add_dependencies(arkcompiler irtoc_generate_ir_inline)
253add_dependencies(arkcompiler intrinsics_gen_compiler)
254add_dependencies(arkcompiler intrinsics_gen_arkruntime)
255add_dependencies(arkcompiler entrypoints_gen)
256add_dependencies(arkcompiler entrypoints_compiler_checksum_gen)
257add_dependencies(arkcompiler cross_values)
258add_dependencies(arkcompiler cpu_features_gen)
259add_dependencies(arkcompiler asm_defines_generator)
260
261if (PANDA_TARGET_MOBILE OR PANDA_TARGET_OHOS)
262  add_dependencies(host_tools_depends arkcompiler)
263endif()
264
265target_link_libraries(arkcompiler arkbase arkfile)
266if (NOT PANDA_TARGET_WINDOWS AND NOT PANDA_TARGET_MACOS)
267  target_link_libraries(arkcompiler arkencoder)
268endif()
269
270target_include_directories(arkcompiler
271    PUBLIC ${PANDA_ROOT}
272    PUBLIC ${PANDA_ROOT}/runtime
273    PUBLIC ${PANDA_BINARY_ROOT}/runtime/include
274    PUBLIC ${PANDA_BINARY_ROOT}/cross_values
275    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
276    PUBLIC ${GENERATED_DIR}
277)
278
279# Disable warning about offsetof usage for non-standard layout types.
280# In C++17 offsetof is conditionally implemented for such types, so
281# compiler should issue error if it doesn't implemented offsetof for
282# them. Also we use static asserts to ensure that offsetof works correcly
283# for non-standard layout types.
284target_compile_options(arkcompiler PUBLIC -Wno-invalid-offsetof)
285
286set(PANDA_COMPILER_TESTS_SOURCES
287    tests/adjust_arefs_test.cpp
288    tests/alias_analysis_test.cpp
289    tests/aot_test.cpp
290    tests/balance_expressions_test.cpp
291    tests/basicblock_test.cpp
292    tests/bounds_analysis_test.cpp
293    tests/branch_elimination_test.cpp
294    tests/call_input_types_test.cpp
295    tests/checks_elimination_test.cpp
296    tests/cleanup_test.cpp
297    tests/codegen_runner_test.cpp
298    tests/code_info_test.cpp
299    tests/code_sink_test.cpp
300    tests/const_folding_test.cpp
301    tests/cse_test.cpp
302    tests/deoptimize_elimination_test.cpp
303    tests/dom_tree_test.cpp
304    tests/graph_cloner_test.cpp
305    tests/graph_comparator_test.cpp
306    tests/graph_creation_test.cpp
307    tests/if_conversion_test.cpp
308    tests/inlining_test.cpp
309    tests/inst_test.cpp
310    tests/iterators_test.cpp
311    tests/licm_test.cpp
312    tests/liveness_analyzer_test.cpp
313    tests/live_registers_test.cpp
314    tests/loop_analyzer_test.cpp
315    tests/loop_peeling_test.cpp
316    tests/lse_test.cpp
317    tests/memory_barriers_test.cpp
318    tests/memory_coalescing_test.cpp
319    tests/method_properties_test.cpp
320    tests/monitor_analysis_test.cpp
321    tests/move_constants_test.cpp
322    tests/osr_test.cpp
323    tests/peepholes_test.cpp
324    tests/redundant_loop_elimination_test.cpp
325    tests/reg_alloc_common_test.cpp
326    tests/reg_alloc_graph_coloring_test.cpp
327    tests/reg_alloc_interference_graph_test.cpp
328    tests/rpo_test.cpp
329    tests/scheduler_test.cpp
330    tests/split_resolver_test.cpp
331    tests/try_catch_resolving_test.cpp
332    tests/unit_test.cpp
333    tests/vn_test.cpp
334    tests/class_hash_table_test.cpp
335    tests/linear_order_test.cpp
336    tests/profiling_runner_test.cpp
337)
338set_source_files_properties(tests/loop_unroll_test.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
339
340# Distinguish 'PANDA_COMPILER_TARGET_..' and 'PANDA_TARGET_..' because for PANDA_TARGET_AMD64 tests
341# are being executed for Arch::AARCH64
342if(PANDA_COMPILER_TARGET_AARCH64 OR PANDA_TARGET_ARM32)
343    if(PANDA_COMPILER_TARGET_AARCH64)
344        list(APPEND PANDA_COMPILER_TESTS_SOURCES
345            tests/aarch64/codegen_test.cpp
346        )
347    endif()
348    list(APPEND PANDA_COMPILER_TESTS_SOURCES
349        tests/life_intervals_test.cpp
350        tests/loop_unroll_test.cpp
351        tests/reg_alloc_linear_scan_test.cpp
352        tests/reg_alloc_verifier_test.cpp
353    )
354    list(APPEND PANDA_COMPILER_TESTS_SOURCES
355        tests/lowering_test.cpp)
356endif()
357
358if(PANDA_TARGET_AMD64 OR PANDA_NIGHTLY_TEST_ON)
359    list(APPEND PANDA_COMPILER_TESTS_SOURCES
360    tests/ir_builder_test.cpp)
361endif()
362
363set(PANDA_COMPILER_TESTS_LIBRARIES arkcompiler arkbase arkassembler arkruntime arkaotmanager aot_builder)
364
365set(ENCODER_TESTS_SOURCES
366    tests/encoder_operands.cpp
367    tests/constructor_test.cpp
368    )
369
370if(PANDA_COMPILER_ENABLE)
371    list(APPEND ENCODER_TESTS_SOURCES tests/asm_printer_test.cpp)
372endif()
373
374if (PANDA_TARGET_ARM32 AND PANDA_COMPILER_TARGET_AARCH32)
375    # Append to PANDA_COMPILER_TESTS_SOURCES modified version of inst_generator_test
376    list(APPEND ENCODER_TESTS_SOURCES
377        tests/aarch32/callconv32_test.cpp
378        tests/aarch32/encoder32_test.cpp
379        tests/aarch32/register32_test.cpp
380        )
381endif (PANDA_TARGET_ARM32 AND PANDA_COMPILER_TARGET_AARCH32)
382
383if (PANDA_TARGET_ARM64)
384    list(APPEND ENCODER_TESTS_SOURCES
385        tests/aarch64/callconv64_test.cpp
386        tests/aarch64/encoder64_test.cpp
387        tests/aarch64/register64_test.cpp
388        )
389endif (PANDA_TARGET_ARM64)
390
391if (PANDA_TARGET_X86)
392    list(APPEND ENCODER_TESTS_SOURCES
393        tests/x86/asmjit_test.cpp
394        )
395    list(APPEND PANDA_COMPILER_TESTS_LIBRARIES asmjit)
396endif (PANDA_TARGET_X86)
397
398if (PANDA_TARGET_AMD64)
399    list(APPEND ENCODER_TESTS_SOURCES
400        tests/amd64/asmjit_test.cpp
401        tests/amd64/callconv64_test.cpp
402        tests/amd64/encoder64_test.cpp
403        tests/amd64/register64_test.cpp
404        )
405    if (PANDA_COMPILER_TARGET_AARCH64)
406        list(APPEND ENCODER_TESTS_SOURCES
407            tests/encoders_test.cpp
408        )
409    endif()
410    list(APPEND PANDA_COMPILER_TESTS_LIBRARIES asmjit)
411endif (PANDA_TARGET_AMD64)
412
413
414if (NOT (PANDA_TARGET_MOBILE OR PANDA_TARGET_OHOS OR PANDA_ENABLE_FUZZBENCH))
415    list(APPEND PANDA_COMPILER_TESTS_LIBRARIES stdc++fs)
416endif()
417
418if(NOT PANDA_MINIMAL_VIXL AND PANDA_COMPILER_ENABLE)
419    panda_add_gtest(
420        CONTAINS_MAIN
421        NAME compiler_unit_tests
422        SOURCES
423            ${PANDA_COMPILER_TESTS_SOURCES}
424        LIBRARIES
425            ${PANDA_COMPILER_TESTS_LIBRARIES}
426        SANITIZERS
427            ${PANDA_SANITIZERS_LIST}
428    )
429endif()
430
431#  AMD64 and X86 - for unit tests
432if(NOT PANDA_MINIMAL_VIXL AND PANDA_TARGET_AMD64 AND PANDA_WITH_TESTS)
433    set(PANDA_CODEGEN_TESTS_SOURCES
434        tests/unit_test.cpp
435        tests/spill_fill_encoder_test.cpp
436        )
437    if(PANDA_COMPILER_TARGET_AARCH64)
438        list(APPEND PANDA_CODEGEN_TESTS_SOURCES
439            tests/codegen_test.cpp
440        )
441    endif()
442    set_source_files_properties(tests/codegen_test.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
443    panda_add_gtest(
444        CONTAINS_MAIN
445        NAME compiler_codegen_tests
446        SOURCES
447            ${PANDA_CODEGEN_TESTS_SOURCES}
448        LIBRARIES
449            ${PANDA_COMPILER_TESTS_LIBRARIES}
450        SANITIZERS
451            ${PANDA_SANITIZERS_LIST}
452    )
453
454    if (PANDA_WITH_TESTS AND PANDA_COMPILER_TARGET_AARCH64)
455        set(PANDA_INST_GEN_TESTS_SOURCES
456            tests/unit_test.cpp
457            tests/inst_generator.cpp
458            tests/inst_generator_test.cpp
459            )
460        set_source_files_properties(tests/inst_generator_test.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
461        panda_add_gtest(
462            CONTAINS_MAIN
463            NAME compiler_inst_gen_tests
464            SOURCES
465                ${PANDA_INST_GEN_TESTS_SOURCES}
466            LIBRARIES
467                ${PANDA_COMPILER_TESTS_LIBRARIES}
468            SANITIZERS
469                ${PANDA_SANITIZERS_LIST}
470        )
471
472        set(PANDA_INTRINSIC_CODEGEN_TESTS_SOURCES
473            tests/unit_test.cpp
474            tests/inst_generator.cpp
475            tests/intrinsic_codegen_test.cpp
476            )
477        set_source_files_properties(tests/intrinsic_codegen_test.cpp PROPERTIES COMPILE_FLAGS -Wno-shadow)
478        panda_add_gtest(
479            CONTAINS_MAIN
480            NAME compiler_intrinsic_codegen_arm64_tests
481            SOURCES
482                ${PANDA_INTRINSIC_CODEGEN_TESTS_SOURCES}
483            LIBRARIES
484                ${PANDA_COMPILER_TESTS_LIBRARIES}
485            SANITIZERS
486                ${PANDA_SANITIZERS_LIST}
487        )
488        target_compile_options(compiler_intrinsic_codegen_arm64_tests PUBLIC  "-DINTRINSIC_CODEGEN_TEST_ARM64")
489
490        panda_add_gtest(
491            CONTAINS_MAIN
492            NAME compiler_intrinsic_codegen_amd64_tests
493            SOURCES
494                ${PANDA_INTRINSIC_CODEGEN_TESTS_SOURCES}
495            LIBRARIES
496                ${PANDA_COMPILER_TESTS_LIBRARIES}
497            SANITIZERS
498                ${PANDA_SANITIZERS_LIST}
499        )
500        target_compile_options(compiler_intrinsic_codegen_amd64_tests PUBLIC  "-DINTRINSIC_CODEGEN_TEST_AMD64")
501
502        panda_add_gtest(
503            CONTAINS_MAIN
504            NAME compiler_intrinsic_codegen_arm32_tests
505            SOURCES
506                ${PANDA_INTRINSIC_CODEGEN_TESTS_SOURCES}
507            LIBRARIES
508                ${PANDA_COMPILER_TESTS_LIBRARIES}
509            SANITIZERS
510                ${PANDA_SANITIZERS_LIST}
511        )
512        target_compile_options(compiler_intrinsic_codegen_arm32_tests PUBLIC  "-DINTRINSIC_CODEGEN_TEST_ARM32")
513    endif()
514endif()
515
516if(NOT PANDA_MINIMAL_VIXL AND PANDA_WITH_TESTS AND PANDA_COMPILER_ENABLE)
517  add_dependencies(compiler_unit_tests ark_aot)
518  # TODO(igorban): Enable build in other platforms
519  if (PANDA_TARGET_AMD64 OR PANDA_TARGET_ARM64)
520    add_dependencies(compiler_unit_tests ark_aotdump)
521  endif()
522
523
524  target_include_directories(compiler_unit_tests
525    PUBLIC "$<TARGET_PROPERTY:arkruntime,INTERFACE_INCLUDE_DIRECTORIES>"
526  )
527
528  if(PANDA_TARGET_AMD64 AND PANDA_COMPILER_TARGET_AARCH64)
529    target_include_directories(compiler_inst_gen_tests
530        PUBLIC "$<TARGET_PROPERTY:arkruntime,INTERFACE_INCLUDE_DIRECTORIES>"
531    )
532  endif()
533  if(PANDA_TARGET_AMD64)
534    target_include_directories(compiler_codegen_tests
535        PUBLIC "$<TARGET_PROPERTY:arkruntime,INTERFACE_INCLUDE_DIRECTORIES>"
536    )
537  endif()
538endif()
539
540# Encoder gtests are separate from other, because they are test the library, not whole compiler
541# Please, do not build them together - to do not make additional dependencies!
542if(NOT PANDA_MINIMAL_VIXL AND PANDA_WITH_TESTS)
543    panda_add_gtest(
544        NAME encoder_unit_tests
545        SOURCES
546            ${ENCODER_TESTS_SOURCES}
547        LIBRARIES
548            ${PANDA_COMPILER_TESTS_LIBRARIES}
549        SANITIZERS
550            ${PANDA_SANITIZERS_LIST}
551    )
552    target_compile_options(encoder_unit_tests PUBLIC "-Wno-unused-variable" "-Wno-uninitialized" "-Wno-shadow")
553endif()
554
555panda_add_sanitizers(TARGET arkcompiler SANITIZERS ${PANDA_SANITIZERS_LIST})
556
557# Special target to create compile_commands.json in right dir.
558add_check_style(".")
559
560# Enable documentation
561add_doxygen(
562    NAME    "compiler"
563    PATH    "."
564)
565
566# Support mobile execution
567if(NOT PANDA_MINIMAL_VIXL AND PANDA_WITH_TESTS AND NOT (PANDA_TARGET_MOBILE OR PANDA_TARGET_OHOS) AND PANDA_COMPILER_ENABLE)
568    set(ASM_TEST_LIST
569        "mov"
570        "neg"
571        "abs"
572        "not"
573        "add"
574        "sub"
575        "mul"
576        "shl"
577        "shr"
578        "ashr"
579        "and"
580        "or"
581        "xor"
582        )
583
584    if (PANDA_TARGET_AMD64)
585        set(LIBGENERATED_DIR ${CMAKE_BINARY_DIR}/bin-gtests/asm_output/amd64/)
586    elseif (PANDA_TARGET_ARM64)
587        set(LIBGENERATED_DIR ${CMAKE_BINARY_DIR}/bin-gtests/asm_output/aarch64/)
588    elseif(PANDA_TARGET_ARM32)
589        set(LIBGENERATED_DIR ${CMAKE_BINARY_DIR}/bin-gtests/asm_output/aarch32/)
590    else()
591        set(LIBGENERATED_FILES "")
592    endif()
593
594    # Main target
595    add_custom_target(asm_test)
596
597    # Pseudo-target for generate asm
598    add_custom_target(asm_generate)
599    add_dependencies(asm_generate encoder_unit_tests_gtests)
600
601    foreach(TEST ${ASM_TEST_LIST})
602        set(TEST_ASM ${LIBGENERATED_DIR}/${TEST}.S)
603        add_custom_command(
604                        OUTPUT ${TEST_ASM}
605                        COMMAND echo " Pseudo-command for generate asm ${TEST_ASM}" > /dev/null
606                        DEPENDS asm_generate)
607        set_property(SOURCE ${TEST_ASM} PROPERTY GENERATED TRUE)
608        add_custom_target(${TEST} DEPENDS ${TEST_ASM})
609        add_dependencies(asm_test ${TEST})
610        list(APPEND LIBGENERATED_FILES ${LIBGENERATED_DIR}/${TEST}.S)
611    endforeach()
612
613    enable_language(ASM)
614
615    set(ASM_CALL_TEST
616        tests/asm_caller.cpp
617        ${LIBGENERATED_FILES}
618    )
619
620    common_add_gtest(
621        NAME compiler_asm_tests
622        SOURCES
623            ${ASM_CALL_TEST}
624        LIBRARIES
625            ${PANDA_COMPILER_TESTS_LIBRARIES}
626        SANITIZERS
627            ${PANDA_SANITIZERS_LIST}
628        OUTPUT_DIRECTORY
629            ${PANDA_BINARY_ROOT}/bin-gtests
630            )
631    if(PANDA_WITH_TESTS)
632      add_dependencies(asm_test compiler_asm_tests)
633    endif()
634    # PANDA_TARGET_MOBILE
635endif()
636
637add_subdirectory(tools/paoc ark_aot)
638
639if (NOT PANDA_MINIMAL_VIXL AND (PANDA_TARGET_AMD64 OR PANDA_TARGET_ARM64))
640    add_subdirectory(tools/aotdump aotdump)
641endif()
642add_subdirectory(aot)
643add_subdirectory(aot/aot_builder aot_builder)
644