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