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.3.2 FATAL_ERROR)
15project(assembler CXX)
16
17panda_add_executable(ark_asm pandasm.cpp)
18
19set(PANDASM_BIN_TESTS ${CMAKE_CURRENT_BINARY_DIR}/tests)
20file(MAKE_DIRECTORY "${PANDASM_BIN_TESTS}")
21
22panda_isa_gen(
23    TEMPLATES
24        "isa.h.erb"
25        "function_collect_string.cpp.erb"
26        "ins_emit.h.erb"
27        "ins_to_string.cpp.erb"
28        "ins_create_api.h.erb"
29        "opcode_parsing.h.erb"
30        "operand_types_print.h.erb"
31    REQUIRES
32        "${CMAKE_CURRENT_SOURCE_DIR}/asm_isapi.rb"
33        "${PANDA_ROOT}/libpandafile/pandafile_isapi.rb"
34)
35
36set(SOURCES
37    lexer.cpp
38    annotation.cpp
39    assembly-emitter.cpp
40    assembly-parser.cpp
41    assembly-program.cpp
42    assembly-type.cpp
43    assembly-ins.cpp
44    context.cpp
45    meta.cpp
46    ins_to_string.cpp
47    extensions/extensions.cpp
48)
49
50set(META_GEN_H ${CMAKE_CURRENT_BINARY_DIR}/meta_gen.h)
51panda_gen_file(
52    DATAFILE ${CMAKE_CURRENT_SOURCE_DIR}/metadata.yaml
53    TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/templates/meta_gen.cpp.erb
54    OUTPUTFILE ${META_GEN_H}
55    REQUIRES ${CMAKE_CURRENT_SOURCE_DIR}/asm_metadata.rb
56)
57add_custom_target(meta_gen_h DEPENDS ${META_GEN_H})
58
59add_library(arkassembler ${PANDA_DEFAULT_LIB_TYPE} ${SOURCES})
60add_dependencies(arkassembler
61    isa_gen_assembler
62    arkfile
63    meta_gen_h
64)
65
66target_include_directories(arkassembler PUBLIC
67    ${CMAKE_CURRENT_BINARY_DIR}
68    ${CMAKE_CURRENT_SOURCE_DIR}
69    ${CMAKE_BINARY_DIR}/libpandabase
70    ${PANDA_ROOT}
71)
72
73panda_add_to_clang_tidy(arkassembler)
74panda_add_to_clang_tidy(TARGET ark_asm CHECKS
75    "-cert-dcl21-cpp"
76    "-cppcoreguidelines-macro-usage"
77    "-google-runtime-references"
78    "-misc-non-private-member-variables-in-classes"
79)
80
81target_link_libraries(arkassembler arkfile)
82target_link_libraries(ark_asm arkassembler arkbase)
83if(PANDA_WITH_BYTECODE_OPTIMIZER)
84    target_link_libraries(ark_asm arkbytecodeopt)
85endif()
86
87include_directories(${PANDA_ROOT}/libpandabase/)
88include_directories(${CMAKE_BINARY_DIR}/libpandafile/include/)
89
90panda_add_gtest(
91    NAME assembler_tests
92    SOURCES
93        tests/lexer_test.cpp
94        tests/parser_test.cpp
95        tests/emitter_test.cpp
96        tests/mangling_tests.cpp
97    LIBRARIES
98        arkbase arkassembler
99    SANITIZERS
100        ${PANDA_SANITIZERS_LIST}
101)
102if(TARGET assembler_tests)
103    target_compile_options(assembler_tests PUBLIC "-Wno-ignored-attributes")
104endif()
105
106panda_add_sanitizers(TARGET arkassembler SANITIZERS ${PANDA_SANITIZERS_LIST})
107panda_add_sanitizers(TARGET ark_asm SANITIZERS ${PANDA_SANITIZERS_LIST})
108
109# TODO: remove after all components will use ark_asm instead of pandasm
110add_custom_target(pandasm ALL
111                  COMMAND cd $<TARGET_FILE_DIR:ark_asm> && ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_NAME:ark_asm> pandasm)
112
113add_dependencies(pandasm ark_asm)
114
115add_check_style(".")
116
117if (TARGET host_tools_depends)
118    add_dependencies(host_tools_depends arkassembler)
119endif()
120
121if (DEFINED PANDA_ROOT_BINARY_DIR)
122    # Special case for host tool build.
123    target_include_directories(arkassembler PUBLIC ${PANDA_ROOT_BINARY_DIR}/assembler)
124endif()
125
126if (PANDA_ENABLE_AFL)
127    include("${PANDA_ROOT}/fuzzing/Fuzzing.cmake")
128    panda_substitute_libs(TARGET arkassembler LIBS arkbase c_secshared arkfile)
129endif()
130