• 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.3.2 FATAL_ERROR)
15project(arkdisassembler CXX)
16
17panda_add_executable(ark_disasm disasm.cpp)
18
19set(GENERATOR ${PANDA_ROOT}/libpandafile/types.rb)
20set(TEMPLATE ${CMAKE_CURRENT_LIST_DIR}/templates/type_to_pandasm_type.cpp.erb)
21set(DATAFILE ${PANDA_ROOT}/libpandafile/types.yaml)
22set(DEPENDENCIES ${GENERATOR} ${TEMPLATE} ${DATAFILE})
23set(OUTFILE "${CMAKE_CURRENT_BINARY_DIR}/type_to_pandasm_type.cpp")
24add_custom_command(OUTPUT "${OUTFILE}"
25                   COMMENT "Generating type_to_pandasm_type.cpp"
26                   COMMAND ${PANDA_ROOT}/isa/gen.rb -d ${DATAFILE} -t ${TEMPLATE} -o "${OUTFILE}" -r ${GENERATOR}
27                   DEPENDS ${DEPENDENCIES})
28add_custom_target(type_to_pandasm_type_gen_${PROJECT_NAME} ALL DEPENDS "${OUTFILE}")
29
30panda_isa_gen(
31    TEMPLATES
32        "opcode_translator.cpp.erb"
33        "bc_ins_to_pandasm_ins.cpp.erb"
34        "get_ins_info.cpp.erb"
35    REQUIRES
36        "${PANDA_ROOT}/assembler/asm_isapi.rb"
37        "${PANDA_ROOT}/libpandafile/pandafile_isapi.rb"
38)
39
40add_library(arkdisassembler ${PANDA_DEFAULT_LIB_TYPE}
41    disassembler.cpp
42    opcode_translator.cpp
43    bc_ins_to_pandasm_ins.cpp
44    get_ins_info.cpp
45    type_to_pandasm_type.cpp
46)
47
48target_include_directories(arkdisassembler
49    PUBLIC ${CMAKE_CURRENT_BINARY_DIR}
50    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
51    PUBLIC ${CMAKE_SOURCE_DIR}/libpandabase
52    PUBLIC ${CMAKE_BINARY_DIR}/libpandabase
53    PUBLIC ${CMAKE_BINARY_DIR}/libpandafile/include
54)
55
56target_link_libraries(arkdisassembler arkfile arkbase arkassembler)
57
58target_link_libraries(ark_disasm arkdisassembler arkbase arkfile arkassembler)
59
60panda_add_to_clang_tidy(arkdisassembler)
61panda_add_to_clang_tidy(TARGET ark_disasm CHECKS
62    "-cert-dcl21-cpp"
63    "-cppcoreguidelines-macro-usage"
64    "-google-runtime-references"
65    "-misc-non-private-member-variables-in-classes"
66)
67
68panda_add_sanitizers(TARGET arkdisassembler SANITIZERS ${PANDA_SANITIZERS_LIST})
69panda_add_sanitizers(TARGET ark_disasm SANITIZERS ${PANDA_SANITIZERS_LIST})
70
71add_check_style(".")
72
73if(NOT PANDA_WITH_TESTS)
74    return()
75endif()
76
77# disasm_bin directory
78set(DISASM_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
79file(MAKE_DIRECTORY "${DISASM_BIN_DIR}")
80
81# disasm_tests directory
82set(DISASM_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests/sources)
83
84set(FUNCTIONS_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/functions_test.cpp)
85set(INSTRUCTIONS_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/instructions_test.cpp)
86set(LABELS_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/labels_test.cpp)
87set(LITERALS_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/literals_test.cpp)
88set(METADATA_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/metadata_test.cpp)
89set(RECORDS_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/records_test.cpp)
90
91configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/functions_test.cpp.in ${FUNCTIONS_TEST_SRC} @ONLY)
92configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/instructions_test.cpp.in ${INSTRUCTIONS_TEST_SRC} @ONLY)
93configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/labels_test.cpp.in ${LABELS_TEST_SRC} @ONLY)
94configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/literals_test.cpp.in ${LITERALS_TEST_SRC} @ONLY)
95configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/metadata_test.cpp.in ${METADATA_TEST_SRC} @ONLY)
96configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/records_test.cpp.in ${RECORDS_TEST_SRC} @ONLY)
97
98
99panda_add_gtest(
100   NAME disasm_tests
101   SOURCES
102       ${FUNCTIONS_TEST_SRC}
103       ${INSTRUCTIONS_TEST_SRC}
104       ${LABELS_TEST_SRC}
105       ${LITERALS_TEST_SRC}
106       ${METADATA_TEST_SRC}
107       ${RECORDS_TEST_SRC}
108   LIBRARIES
109       arkbase arkassembler arkdisassembler arkfile
110   SANITIZERS
111       ${PANDA_SANITIZERS_LIST}
112)
113
114##############################
115
116if(CMAKE_CROSSCOMPILING)
117    ExternalProject_Get_Property(panda_host_tools binary_dir)
118    set(assembler_target panda_host_tools)
119    set(assembler_bin    "${binary_dir}/assembler/ark_asm")
120else()
121    set(assembler_target ark_asm)
122    set(assembler_bin    $<TARGET_FILE:${assembler_target}>)
123endif()
124
125function(compile_pre_build)
126    set(options)
127    set(singleValueArgs TARGET FILE_SRC FILE_DST)
128    set(multiValueArgs)
129
130    cmake_parse_arguments(CPB "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN})
131
132    if (NOT DEFINED CPB_TARGET)
133        message(FATAL_ERROR "TARGET argument is missing")
134    endif()
135
136    if (NOT DEFINED CPB_FILE_SRC)
137        message(FATAL_ERROR "FILE_SRC argument is missing")
138    endif()
139
140    if (NOT DEFINED CPB_FILE_DST)
141        message(FATAL_ERROR "FILE_DST argument is missing")
142    endif()
143
144    add_custom_command(OUTPUT "${CPB_FILE_DST}"
145                       COMMENT "Compiling ${CPB_FILE_SRC} ( ${CPB_TARGET} ) in c_p_b function"
146                       COMMAND ${assembler_bin} "${CPB_FILE_SRC}" "${CPB_FILE_DST}"
147                       DEPENDS ${assembler_target} "${CPB_FILE_SRC}")
148
149    add_custom_target(${CPB_TARGET}
150                      COMMENT "reached ${CPB_TARGET}"
151                      DEPENDS "${CPB_FILE_DST}")
152endfunction()
153
154# label_tests files
155compile_pre_build(TARGET disasm_binaries-labels1
156                  FILE_SRC ${DISASM_TESTS_DIR}/labels1.pa
157                  FILE_DST ${DISASM_BIN_DIR}/labels1.bc)
158compile_pre_build(TARGET disasm_binaries-labels2
159                  FILE_SRC ${DISASM_TESTS_DIR}/labels2.pa
160                  FILE_DST ${DISASM_BIN_DIR}/labels2.bc)
161compile_pre_build(TARGET disasm_binaries-exceptions
162                  FILE_SRC ${DISASM_TESTS_DIR}/exceptions.pa
163                  FILE_DST ${DISASM_BIN_DIR}/exceptions.bc)
164
165add_dependencies(disasm_tests disasm_binaries-labels1)
166add_dependencies(disasm_tests disasm_binaries-labels2)
167add_dependencies(disasm_tests disasm_binaries-exceptions)
168
169# record_tests files
170compile_pre_build(TARGET disasm_binaries-record_with_fields
171                  FILE_SRC ${DISASM_TESTS_DIR}/record_with_fields.pa
172                  FILE_DST ${DISASM_BIN_DIR}/record_with_fields.bc)
173compile_pre_build(TARGET disasm_binaries-record_in_record
174                  FILE_SRC ${DISASM_TESTS_DIR}/record_in_record.pa
175                  FILE_DST ${DISASM_BIN_DIR}/record_in_record.bc)
176compile_pre_build(TARGET disasm_binaries-empty_record
177                  FILE_SRC ${DISASM_TESTS_DIR}/empty_record.pa
178                  FILE_DST ${DISASM_BIN_DIR}/empty_record.bc)
179
180add_dependencies(disasm_tests disasm_binaries-record_with_fields)
181add_dependencies(disasm_tests disasm_binaries-record_in_record)
182add_dependencies(disasm_tests disasm_binaries-empty_record)
183
184# functions_tests files
185compile_pre_build(TARGET disasm_binaries-empty_function
186                  FILE_SRC ${DISASM_TESTS_DIR}/empty_function.pa
187                  FILE_DST ${DISASM_BIN_DIR}/empty_function.bc)
188compile_pre_build(TARGET disasm_binaries-overloading
189                  FILE_SRC ${DISASM_TESTS_DIR}/overloading.pa
190                  FILE_DST ${DISASM_BIN_DIR}/overloading.bc)
191
192add_dependencies(disasm_tests disasm_binaries-empty_function)
193add_dependencies(disasm_tests disasm_binaries-overloading)
194
195# instruction_tests files
196compile_pre_build(TARGET disasm_binaries-instructions
197                  FILE_SRC ${DISASM_TESTS_DIR}/instructions.pa
198                  FILE_DST ${DISASM_BIN_DIR}/instructions.bc)
199compile_pre_build(TARGET disasm_binaries-returns
200                  FILE_SRC ${DISASM_TESTS_DIR}/returns.pa
201                  FILE_DST ${DISASM_BIN_DIR}/returns.bc)
202compile_pre_build(TARGET disasm_binaries-calls
203                  FILE_SRC ${DISASM_TESTS_DIR}/calls.pa
204                  FILE_DST ${DISASM_BIN_DIR}/calls.bc)
205compile_pre_build(TARGET disasm_binaries-newarrs
206                  FILE_SRC ${DISASM_TESTS_DIR}/newarrs.pa
207                  FILE_DST ${DISASM_BIN_DIR}/newarrs.bc)
208
209add_dependencies(disasm_tests disasm_binaries-instructions)
210add_dependencies(disasm_tests disasm_binaries-returns)
211add_dependencies(disasm_tests disasm_binaries-calls)
212add_dependencies(disasm_tests disasm_binaries-newarrs)
213
214# metadata_tests files
215compile_pre_build(TARGET disasm_binaries-meta
216                  FILE_SRC ${DISASM_TESTS_DIR}/meta.pa
217                  FILE_DST ${DISASM_BIN_DIR}/meta.bc)
218
219add_dependencies(disasm_tests disasm_binaries-meta)
220
221# literals_tests files
222compile_pre_build(TARGET disasm_binaries-literals
223                  FILE_SRC ${DISASM_TESTS_DIR}/literals.pa
224                  FILE_DST ${DISASM_BIN_DIR}/literals.bc)
225compile_pre_build(TARGET disasm_binaries-literals_same
226                  FILE_SRC ${DISASM_TESTS_DIR}/literals_same.pa
227                  FILE_DST ${DISASM_BIN_DIR}/literals_same.bc)
228
229add_dependencies(disasm_tests disasm_binaries-literals)
230add_dependencies(disasm_tests disasm_binaries-literals_same)
231
232add_dependencies(arkdisassembler isa_gen_${PROJECT_NAME} type_to_pandasm_type_gen_${PROJECT_NAME})
233
234##############################
235