diff --git a/CMakeLists.txt b/CMakeLists.txt index 1be6a4e74c06..f2a585c2119e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1335,14 +1335,23 @@ if(CONFIG_BUILD_OUTPUT_S19) endif() if(CONFIG_OUTPUT_DISASSEMBLY) + set(out_disassembly_cmd "") + set(out_disassembly_byprod "") + bintools_objdump( + RESULT_CMD_LIST out_disassembly_cmd + RESULT_BYPROD_LIST out_disassembly_byprod + DISASSEMBLE_SOURCE + FILE_INPUT ${KERNEL_ELF_NAME} + FILE_OUTPUT ${KERNEL_LST_NAME} + ) list(APPEND post_build_commands - COMMAND - ${CMAKE_OBJDUMP} -S ${KERNEL_ELF_NAME} > ${KERNEL_LST_NAME} + ${out_disassembly_cmd} ) list(APPEND post_build_byproducts ${KERNEL_LST_NAME} + ${out_disassembly_byprod} ) endif() diff --git a/cmake/bintools/gnu/target.cmake b/cmake/bintools/gnu/target.cmake index 141c1e0a4322..4020bfc4bc1f 100644 --- a/cmake/bintools/gnu/target.cmake +++ b/cmake/bintools/gnu/target.cmake @@ -16,3 +16,4 @@ find_program(CMAKE_GDB gdb-multiarch PATH ${TOOLCHAIN_HOME} # Include bin tool abstraction macros include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake) +include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake) diff --git a/cmake/bintools/gnu/target_objdump.cmake b/cmake/bintools/gnu/target_objdump.cmake new file mode 100644 index 000000000000..a1d5aebca9f8 --- /dev/null +++ b/cmake/bintools/gnu/target_objdump.cmake @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Construct a commandline suitable for calling the toolchain binary tools +# version of objdump. +# +# Usage: +# bintools_objdump( +# RESULT_CMD_LIST +# RESULT_BYPROD_LIST +# +# DISASSEMBLE +# DISASSEMBLE_SOURCE < Display source code intermixed with disassembly, if possible> +# +# FILE_INPUT +# FILE_OUTPUT +# ) +function(bintools_objdump) + cmake_parse_arguments( + # Prefix of output variables + BINTOOLS_OBJDUMP + # List of argument names without values, hence boolean + "DISASSEMBLE;DISASSEMBLE_SOURCE" + # List of argument names with one value + "RESULT_CMD_LIST;RESULT_BYPROD_LIST;FILE_INPUT;FILE_OUTPUT" + # List of argument names with multible values + "" + # Parser input + ${ARGN} + ) + + # Verify arguments + if(NOT DEFINED BINTOOLS_OBJDUMP_RESULT_CMD_LIST OR NOT DEFINED ${BINTOOLS_OBJDUMP_RESULT_CMD_LIST}) + message(FATAL_ERROR "RESULT_CMD_LIST is required.") + elseif(NOT DEFINED BINTOOLS_OBJDUMP_FILE_INPUT) + message(FATAL_ERROR "FILE_INPUT is required.") + endif() + + # Handle disassembly + set(obj_dump_disassemble "") + if(${BINTOOLS_OBJDUMP_DISASSEMBLE_SOURCE}) + set(obj_dump_disassemble "-S") # --source + elseif(${BINTOOLS_OBJDUMP_DISASSEMBLE}) + set(obj_dump_disassemble "-d") # --disassemble + endif() + + # Handle output + set(obj_dump_output "") + if(DEFINED BINTOOLS_OBJDUMP_FILE_OUTPUT) + set(obj_dump_output > ${BINTOOLS_OBJDUMP_FILE_OUTPUT}) + endif() + + # Construct the command + set(obj_dump_cmd + # Base command + COMMAND ${CMAKE_OBJDUMP} ${obj_dump_disassemble} + # Input and Output + ${BINTOOLS_OBJDUMP_FILE_INPUT} ${obj_dump_output} + ) + + # Place command in the parent provided variable + set(${BINTOOLS_OBJDUMP_RESULT_CMD_LIST} ${obj_dump_cmd} PARENT_SCOPE) + +endfunction(bintools_objdump) diff --git a/cmake/bintools/host-gnu/target.cmake b/cmake/bintools/host-gnu/target.cmake index d802ddf83394..67fb53c7a77a 100644 --- a/cmake/bintools/host-gnu/target.cmake +++ b/cmake/bintools/host-gnu/target.cmake @@ -13,3 +13,4 @@ find_program(CMAKE_GDB gdb ) # Use the gnu binutil abstraction macros include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake) +include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake) diff --git a/cmake/bintools/llvm/target.cmake b/cmake/bintools/llvm/target.cmake index 4c547364de22..f455ece218ac 100644 --- a/cmake/bintools/llvm/target.cmake +++ b/cmake/bintools/llvm/target.cmake @@ -17,3 +17,4 @@ find_program(CMAKE_READELF readelf ${find_program_binutils_args}) # Use the gnu binutil abstraction macros include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake) +include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake)