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