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