yap/cmake/Disassemble.cmake

72 lines
2.5 KiB
CMake

# Copyright Louis Dionne 2016
# Copyright Zach Laine 2016
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
#
#
# This CMake module provides a way to get the disassembly of a function within
# an executable created with `add_executable`. The module provides a `disassemble`
# function that creates a target which, when built, outputs the disassembly of
# the given function within an executable to standard output.
#
# Parameters
# ----------
# target:
# The name of the target to create. Building this target will generate the
# requested disassembly.
#
# EXECUTABLE executable:
# The name of an executable to disassemble. This must be the name of a valid
# executable that was created with `add_executable`. The disassembly target
# thus created will be made dependent on the executable, so that it is built
# automatically when the disassembly is requested.
#
# FUNCTION function-name:
# The name of the function to disassemble in the executable.
#
# [ALL]:
# If provided, the generated target is included in the 'all' target.
#
function(disassemble target)
cmake_parse_arguments(ARGS "ALL" # options
"EXECUTABLE;FUNCTION" # 1 value args
"" # multivalued args
${ARGN})
if (NOT ARGS_EXECUTABLE)
message(FATAL_ERROR "The `EXECUTABLE` argument must be provided.")
endif()
if (NOT TARGET ${ARGS_EXECUTABLE})
message(FATAL_ERROR "The `EXECUTABLE` argument must be the name of a valid "
"executable created with `add_executable`.")
endif()
if (NOT ARGS_FUNCTION)
message(FATAL_ERROR "The `FUNCTION` argument must be provided.")
endif()
if (ARGS_ALL)
set(ARGS_ALL "ALL")
else()
set(ARGS_ALL "")
endif()
if (DISASSEMBLE_lldb)
add_custom_target(${target} ${ARGS_ALL}
COMMAND ${DISASSEMBLE_lldb} -f $<TARGET_FILE:${ARGS_EXECUTABLE}>
-o "disassemble --name ${ARGS_FUNCTION}"
-o quit
DEPENDS ${ARGS_EXECUTABLE}
)
elseif(DISASSEMBLE_gdb)
add_custom_target(${target} ${ARGS_ALL}
COMMAND ${DISASSEMBLE_gdb} -batch -se $<TARGET_FILE:${ARGS_EXECUTABLE}>
-ex "disassemble ${ARGS_FUNCTION}"
DEPENDS ${ARGS_EXECUTABLE}
)
endif()
endfunction()
find_program(DISASSEMBLE_gdb gdb)
find_program(DISASSEMBLE_lldb lldb)