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