diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 56b4f1c..6f85850 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,45 +9,47 @@ on: jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install Conan id: conan uses: turtlebrowser/get-conan@main with: - version: 1.59.0 + version: 2.8.1 - name: Configure conan run: | - conan profile new default --detect - conan profile update settings.compiler.libcxx=libstdc++11 default + conan profile detect + sed -i 's/compiler\.cppstd=.*/compiler.cppstd=20/g' ~/.conan2/profiles/default + conan install --build=fmt/11.0.0 . - name: Build run: | - mkdir build + CURDIR=$PWD + mkdir -p build cd build - cmake -DCMAKE_C_COMPILER=/usr/bin/gcc-10 -DCMAKE_CXX_COMPILER=/usr/bin/g++-10 -DCMAKE_BUILD_TYPE=Release .. - cmake --build . --parallel $(nproc) + cmake "-DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=$CURDIR/conan_provider.cmake" -DCMAKE_C_COMPILER=/usr/bin/gcc-10 -DCMAKE_CXX_COMPILER=/usr/bin/g++-10 -DCMAKE_BUILD_TYPE=Release .. + cmake --build . - name: Unit test run: | - cd build && ctest -V + cd build/src/test && ./asm-parser-test - name: Smoke test run: | - $GITHUB_WORKSPACE/build/bin/asm-parser $GITHUB_WORKSPACE/resources/example_intel.asm > ./example_intel.json + $GITHUB_WORKSPACE/build/src/asm-parser $GITHUB_WORKSPACE/resources/example_intel.asm > ./example_intel.json - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: - path: build/bin/asm-parser + path: build/src/asm-parser - name: Release uses: fnkr/github-action-ghr@v1 if: startsWith(github.ref, 'refs/tags/') env: GHR_COMPRESS: xz - GHR_PATH: build/bin/ + GHR_PATH: build/src/ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 13143f0..1222d90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,28 +11,6 @@ check_ipo_supported() set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_DEBUG FALSE) -if (NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") - message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") - file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.16.1/conan.cmake" - "${CMAKE_BINARY_DIR}/conan.cmake" - TLS_VERIFY ON) -endif () - -include(${CMAKE_BINARY_DIR}/conan.cmake) - -conan_check(VERSION 1.43.1 REQUIRED) - -conan_cmake_run( - REQUIRES - catch2/2.13.7 - approvaltests.cpp/10.12.0 - fmt/9.1.0 - ctre/3.7.1 - BASIC_SETUP - BUILD missing) - -include(${CMAKE_BINARY_DIR}/conan.cmake) - enable_testing() add_subdirectory(src) diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..431c9c0 --- /dev/null +++ b/build.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +PATH=/opt/compiler-explorer/cmake/bin:/opt/compiler-explorer/ninja:$PWD/.venv/bin:$PATH + +rm -Rf build +mkdir build +cmake -B build -G Ninja -S . -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=./conan_provider.cmake -DCMAKE_BUILD_TYPE=Debug +cmake --build build --config Debug + +CURDIR=$PWD + +cd build/src +test/asm-parser-test + +cd $PWD diff --git a/conan_provider.cmake b/conan_provider.cmake new file mode 100644 index 0000000..0d2be00 --- /dev/null +++ b/conan_provider.cmake @@ -0,0 +1,676 @@ +# The MIT License (MIT) +# +# Copyright (c) 2024 JFrog +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +set(CONAN_MINIMUM_VERSION 2.0.5) + +# Create a new policy scope and set the minimum required cmake version so the +# features behind a policy setting like if(... IN_LIST ...) behaves as expected +# even if the parent project does not specify a minimum cmake version or a minimum +# version less than this module requires (e.g. 3.0) before the first project() call. +# (see: https://cmake.org/cmake/help/latest/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.html) +# +# The policy-affecting calls like cmake_policy(SET...) or `cmake_minimum_required` only +# affects the current policy scope, i.e. between the PUSH and POP in this case. +# +# https://cmake.org/cmake/help/book/mastering-cmake/chapter/Policies.html#the-policy-stack +cmake_policy(PUSH) +cmake_minimum_required(VERSION 3.24) + + +function(detect_os os os_api_level os_sdk os_subsystem os_version) + # it could be cross compilation + message(STATUS "CMake-Conan: cmake_system_name=${CMAKE_SYSTEM_NAME}") + if(CMAKE_SYSTEM_NAME AND NOT CMAKE_SYSTEM_NAME STREQUAL "Generic") + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(${os} Macos PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX") + set(${os} Neutrino PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "CYGWIN") + set(${os} Windows PARENT_SCOPE) + set(${os_subsystem} cygwin PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME MATCHES "^MSYS") + set(${os} Windows PARENT_SCOPE) + set(${os_subsystem} msys2 PARENT_SCOPE) + else() + set(${os} ${CMAKE_SYSTEM_NAME} PARENT_SCOPE) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + if(DEFINED ANDROID_PLATFORM) + string(REGEX MATCH "[0-9]+" _os_api_level ${ANDROID_PLATFORM}) + elseif(DEFINED CMAKE_SYSTEM_VERSION) + set(_os_api_level ${CMAKE_SYSTEM_VERSION}) + endif() + message(STATUS "CMake-Conan: android api level=${_os_api_level}") + set(${os_api_level} ${_os_api_level} PARENT_SCOPE) + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS") + # CMAKE_OSX_SYSROOT contains the full path to the SDK for MakeFile/Ninja + # generators, but just has the original input string for Xcode. + if(NOT IS_DIRECTORY ${CMAKE_OSX_SYSROOT}) + set(_os_sdk ${CMAKE_OSX_SYSROOT}) + else() + if(CMAKE_OSX_SYSROOT MATCHES Simulator) + set(apple_platform_suffix simulator) + else() + set(apple_platform_suffix os) + endif() + if(CMAKE_OSX_SYSROOT MATCHES AppleTV) + set(_os_sdk "appletv${apple_platform_suffix}") + elseif(CMAKE_OSX_SYSROOT MATCHES iPhone) + set(_os_sdk "iphone${apple_platform_suffix}") + elseif(CMAKE_OSX_SYSROOT MATCHES Watch) + set(_os_sdk "watch${apple_platform_suffix}") + endif() + endif() + if(DEFINED os_sdk) + message(STATUS "CMake-Conan: cmake_osx_sysroot=${CMAKE_OSX_SYSROOT}") + set(${os_sdk} ${_os_sdk} PARENT_SCOPE) + endif() + if(DEFINED CMAKE_OSX_DEPLOYMENT_TARGET) + message(STATUS "CMake-Conan: cmake_osx_deployment_target=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(${os_version} ${CMAKE_OSX_DEPLOYMENT_TARGET} PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + + +function(detect_arch arch) + # CMAKE_OSX_ARCHITECTURES can contain multiple architectures, but Conan only supports one. + # Therefore this code only finds one. If the recipes support multiple architectures, the + # build will work. Otherwise, there will be a linker error for the missing architecture(s). + if(DEFINED CMAKE_OSX_ARCHITECTURES) + string(REPLACE " " ";" apple_arch_list "${CMAKE_OSX_ARCHITECTURES}") + list(LENGTH apple_arch_list apple_arch_count) + if(apple_arch_count GREATER 1) + message(WARNING "CMake-Conan: Multiple architectures detected, this will only work if Conan recipe(s) produce fat binaries.") + endif() + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS" AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "") + set(host_arch ${CMAKE_OSX_ARCHITECTURES}) + elseif(MSVC) + set(host_arch ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}) + else() + set(host_arch ${CMAKE_SYSTEM_PROCESSOR}) + endif() + if(host_arch MATCHES "aarch64|arm64|ARM64") + set(_arch armv8) + elseif(host_arch MATCHES "armv7|armv7-a|armv7l|ARMV7") + set(_arch armv7) + elseif(host_arch MATCHES armv7s) + set(_arch armv7s) + elseif(host_arch MATCHES "i686|i386|X86") + set(_arch x86) + elseif(host_arch MATCHES "AMD64|amd64|x86_64|x64") + set(_arch x86_64) + endif() + message(STATUS "CMake-Conan: cmake_system_processor=${_arch}") + set(${arch} ${_arch} PARENT_SCOPE) +endfunction() + + +function(detect_cxx_standard cxx_standard) + set(${cxx_standard} ${CMAKE_CXX_STANDARD} PARENT_SCOPE) + if(CMAKE_CXX_EXTENSIONS) + set(${cxx_standard} "gnu${CMAKE_CXX_STANDARD}" PARENT_SCOPE) + endif() +endfunction() + + +macro(detect_gnu_libstdcxx) + # _conan_is_gnu_libstdcxx true if GNU libstdc++ + check_cxx_source_compiles(" + #include + #if !defined(__GLIBCXX__) && !defined(__GLIBCPP__) + static_assert(false); + #endif + int main(){}" _conan_is_gnu_libstdcxx) + + # _conan_gnu_libstdcxx_is_cxx11_abi true if C++11 ABI + check_cxx_source_compiles(" + #include + static_assert(sizeof(std::string) != sizeof(void*), \"using libstdc++\"); + int main () {}" _conan_gnu_libstdcxx_is_cxx11_abi) + + set(_conan_gnu_libstdcxx_suffix "") + if(_conan_gnu_libstdcxx_is_cxx11_abi) + set(_conan_gnu_libstdcxx_suffix "11") + endif() + unset (_conan_gnu_libstdcxx_is_cxx11_abi) +endmacro() + + +macro(detect_libcxx) + # _conan_is_libcxx true if LLVM libc++ + check_cxx_source_compiles(" + #include + #if !defined(_LIBCPP_VERSION) + static_assert(false); + #endif + int main(){}" _conan_is_libcxx) +endmacro() + + +function(detect_lib_cxx lib_cxx) + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + message(STATUS "CMake-Conan: android_stl=${CMAKE_ANDROID_STL_TYPE}") + set(${lib_cxx} ${CMAKE_ANDROID_STL_TYPE} PARENT_SCOPE) + return() + endif() + + include(CheckCXXSourceCompiles) + + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + detect_gnu_libstdcxx() + set(${lib_cxx} "libstdc++${_conan_gnu_libstdcxx_suffix}" PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") + set(${lib_cxx} "libc++" PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_SYSTEM_NAME MATCHES "Windows") + # Check for libc++ + detect_libcxx() + if(_conan_is_libcxx) + set(${lib_cxx} "libc++" PARENT_SCOPE) + return() + endif() + + # Check for libstdc++ + detect_gnu_libstdcxx() + if(_conan_is_gnu_libstdcxx) + set(${lib_cxx} "libstdc++${_conan_gnu_libstdcxx_suffix}" PARENT_SCOPE) + return() + endif() + + # TODO: it would be an error if we reach this point + elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # Do nothing - compiler.runtime and compiler.runtime_type + # should be handled separately: https://github.com/conan-io/cmake-conan/pull/516 + return() + else() + # TODO: unable to determine, ask user to provide a full profile file instead + endif() +endfunction() + + +function(detect_compiler compiler compiler_version compiler_runtime compiler_runtime_type) + if(DEFINED CMAKE_CXX_COMPILER_ID) + set(_compiler ${CMAKE_CXX_COMPILER_ID}) + set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) + else() + if(NOT DEFINED CMAKE_C_COMPILER_ID) + message(FATAL_ERROR "C or C++ compiler not defined") + endif() + set(_compiler ${CMAKE_C_COMPILER_ID}) + set(_compiler_version ${CMAKE_C_COMPILER_VERSION}) + endif() + + message(STATUS "CMake-Conan: CMake compiler=${_compiler}") + message(STATUS "CMake-Conan: CMake compiler version=${_compiler_version}") + + if(_compiler MATCHES MSVC) + set(_compiler "msvc") + string(SUBSTRING ${MSVC_VERSION} 0 3 _compiler_version) + # Configure compiler.runtime and compiler.runtime_type settings for MSVC + if(CMAKE_MSVC_RUNTIME_LIBRARY) + set(_msvc_runtime_library ${CMAKE_MSVC_RUNTIME_LIBRARY}) + else() + set(_msvc_runtime_library MultiThreaded$<$:Debug>DLL) # default value documented by CMake + endif() + + set(_KNOWN_MSVC_RUNTIME_VALUES "") + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded MultiThreadedDLL) + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreadedDebug MultiThreadedDebugDLL) + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded$<$:Debug> MultiThreaded$<$:Debug>DLL) + + # only accept the 6 possible values, otherwise we don't don't know to map this + if(NOT _msvc_runtime_library IN_LIST _KNOWN_MSVC_RUNTIME_VALUES) + message(FATAL_ERROR "CMake-Conan: unable to map MSVC runtime: ${_msvc_runtime_library} to Conan settings") + endif() + + # Runtime is "dynamic" in all cases if it ends in DLL + if(_msvc_runtime_library MATCHES ".*DLL$") + set(_compiler_runtime "dynamic") + else() + set(_compiler_runtime "static") + endif() + message(STATUS "CMake-Conan: CMake compiler.runtime=${_compiler_runtime}") + + # Only define compiler.runtime_type when explicitly requested + # If a generator expression is used, let Conan handle it conditional on build_type + if(NOT _msvc_runtime_library MATCHES ":Debug>") + if(_msvc_runtime_library MATCHES "Debug") + set(_compiler_runtime_type "Debug") + else() + set(_compiler_runtime_type "Release") + endif() + message(STATUS "CMake-Conan: CMake compiler.runtime_type=${_compiler_runtime_type}") + endif() + + unset(_KNOWN_MSVC_RUNTIME_VALUES) + + elseif(_compiler MATCHES AppleClang) + set(_compiler "apple-clang") + string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + list(GET VERSION_LIST 0 _compiler_version) + elseif(_compiler MATCHES Clang) + set(_compiler "clang") + string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + list(GET VERSION_LIST 0 _compiler_version) + elseif(_compiler MATCHES GNU) + set(_compiler "gcc") + string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + list(GET VERSION_LIST 0 _compiler_version) + endif() + + message(STATUS "CMake-Conan: [settings] compiler=${_compiler}") + message(STATUS "CMake-Conan: [settings] compiler.version=${_compiler_version}") + if (_compiler_runtime) + message(STATUS "CMake-Conan: [settings] compiler.runtime=${_compiler_runtime}") + endif() + if (_compiler_runtime_type) + message(STATUS "CMake-Conan: [settings] compiler.runtime_type=${_compiler_runtime_type}") + endif() + + set(${compiler} ${_compiler} PARENT_SCOPE) + set(${compiler_version} ${_compiler_version} PARENT_SCOPE) + set(${compiler_runtime} ${_compiler_runtime} PARENT_SCOPE) + set(${compiler_runtime_type} ${_compiler_runtime_type} PARENT_SCOPE) +endfunction() + + +function(detect_build_type build_type) + get_property(multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT multiconfig_generator) + # Only set when we know we are in a single-configuration generator + # Note: we may want to fail early if `CMAKE_BUILD_TYPE` is not defined + set(${build_type} ${CMAKE_BUILD_TYPE} PARENT_SCOPE) + endif() +endfunction() + + +macro(set_conan_compiler_if_appleclang lang command output_variable) + if(CMAKE_${lang}_COMPILER_ID STREQUAL "AppleClang") + execute_process(COMMAND xcrun --find ${command} + OUTPUT_VARIABLE _xcrun_out OUTPUT_STRIP_TRAILING_WHITESPACE) + cmake_path(GET _xcrun_out PARENT_PATH _xcrun_toolchain_path) + cmake_path(GET CMAKE_${lang}_COMPILER PARENT_PATH _compiler_parent_path) + if ("${_xcrun_toolchain_path}" STREQUAL "${_compiler_parent_path}") + set(${output_variable} "") + endif() + unset(_xcrun_out) + unset(_xcrun_toolchain_path) + unset(_compiler_parent_path) + endif() +endmacro() + + +macro(append_compiler_executables_configuration) + set(_conan_c_compiler "") + set(_conan_cpp_compiler "") + set(_conan_rc_compiler "") + set(_conan_compilers_list "") + if(CMAKE_C_COMPILER) + set(_conan_c_compiler "\"c\":\"${CMAKE_C_COMPILER}\"") + set_conan_compiler_if_appleclang(C cc _conan_c_compiler) + list(APPEND _conan_compilers_list ${_conan_c_compiler}) + else() + message(WARNING "CMake-Conan: The C compiler is not defined. " + "Please define CMAKE_C_COMPILER or enable the C language.") + endif() + if(CMAKE_CXX_COMPILER) + set(_conan_cpp_compiler "\"cpp\":\"${CMAKE_CXX_COMPILER}\"") + set_conan_compiler_if_appleclang(CXX c++ _conan_cpp_compiler) + list(APPEND _conan_compilers_list ${_conan_cpp_compiler}) + else() + message(WARNING "CMake-Conan: The C++ compiler is not defined. " + "Please define CMAKE_CXX_COMPILER or enable the C++ language.") + endif() + if(CMAKE_RC_COMPILER) + set(_conan_rc_compiler "\"rc\":\"${CMAKE_RC_COMPILER}\"") + list(APPEND _conan_compilers_list ${_conan_rc_compiler}) + # Not necessary to warn if RC not defined + endif() + if(NOT "x${_conan_compilers_list}" STREQUAL "x") + string(REPLACE ";" "," _conan_compilers_list "${_conan_compilers_list}") + string(APPEND profile "tools.build:compiler_executables={${_conan_compilers_list}}\n") + endif() + unset(_conan_c_compiler) + unset(_conan_cpp_compiler) + unset(_conan_rc_compiler) + unset(_conan_compilers_list) +endmacro() + + +function(detect_host_profile output_file) + detect_os(os os_api_level os_sdk os_subsystem os_version) + detect_arch(arch) + detect_compiler(compiler compiler_version compiler_runtime compiler_runtime_type) + detect_cxx_standard(compiler_cppstd) + detect_lib_cxx(compiler_libcxx) + detect_build_type(build_type) + + set(profile "") + string(APPEND profile "[settings]\n") + if(arch) + string(APPEND profile arch=${arch} "\n") + endif() + if(os) + string(APPEND profile os=${os} "\n") + endif() + if(os_api_level) + string(APPEND profile os.api_level=${os_api_level} "\n") + endif() + if(os_version) + string(APPEND profile os.version=${os_version} "\n") + endif() + if(os_sdk) + string(APPEND profile os.sdk=${os_sdk} "\n") + endif() + if(os_subsystem) + string(APPEND profile os.subsystem=${os_subsystem} "\n") + endif() + if(compiler) + string(APPEND profile compiler=${compiler} "\n") + endif() + if(compiler_version) + string(APPEND profile compiler.version=${compiler_version} "\n") + endif() + if(compiler_runtime) + string(APPEND profile compiler.runtime=${compiler_runtime} "\n") + endif() + if(compiler_runtime_type) + string(APPEND profile compiler.runtime_type=${compiler_runtime_type} "\n") + endif() + if(compiler_cppstd) + string(APPEND profile compiler.cppstd=${compiler_cppstd} "\n") + endif() + if(compiler_libcxx) + string(APPEND profile compiler.libcxx=${compiler_libcxx} "\n") + endif() + if(build_type) + string(APPEND profile "build_type=${build_type}\n") + endif() + + if(NOT DEFINED output_file) + set(file_name "${CMAKE_BINARY_DIR}/profile") + else() + set(file_name ${output_file}) + endif() + + string(APPEND profile "[conf]\n") + string(APPEND profile "tools.cmake.cmaketoolchain:generator=${CMAKE_GENERATOR}\n") + + # propagate compilers via profile + append_compiler_executables_configuration() + + if(os STREQUAL "Android") + string(APPEND profile "tools.android:ndk_path=${CMAKE_ANDROID_NDK}\n") + endif() + + message(STATUS "CMake-Conan: Creating profile ${file_name}") + file(WRITE ${file_name} ${profile}) + message(STATUS "CMake-Conan: Profile: \n${profile}") +endfunction() + + +function(conan_profile_detect_default) + message(STATUS "CMake-Conan: Checking if a default profile exists") + execute_process(COMMAND ${CONAN_COMMAND} profile path default + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + ECHO_OUTPUT_VARIABLE + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + if(NOT ${return_code} EQUAL "0") + message(STATUS "CMake-Conan: The default profile doesn't exist, detecting it.") + execute_process(COMMAND ${CONAN_COMMAND} profile detect + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + ECHO_OUTPUT_VARIABLE + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif() +endfunction() + + +function(conan_install) + cmake_parse_arguments(ARGS conan_args ${ARGN}) + set(conan_output_folder ${CMAKE_BINARY_DIR}/conan) + # Invoke "conan install" with the provided arguments + set(conan_args ${conan_args} -of=${conan_output_folder}) + message(STATUS "CMake-Conan: conan install ${CMAKE_SOURCE_DIR} ${conan_args} ${ARGN}") + + + # In case there was not a valid cmake executable in the PATH, we inject the + # same we used to invoke the provider to the PATH + if(DEFINED PATH_TO_CMAKE_BIN) + set(old_path $ENV{PATH}) + set(ENV{PATH} "$ENV{PATH}:${PATH_TO_CMAKE_BIN}") + endif() + + execute_process(COMMAND ${CONAN_COMMAND} install ${CMAKE_SOURCE_DIR} ${conan_args} ${ARGN} --format=json + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + if(DEFINED PATH_TO_CMAKE_BIN) + set(ENV{PATH} "${old_path}") + endif() + + if(NOT "${return_code}" STREQUAL "0") + message(FATAL_ERROR "Conan install failed='${return_code}'") + endif() + + # the files are generated in a folder that depends on the layout used, if + # one is specified, but we don't know a priori where this is. + # TODO: this can be made more robust if Conan can provide this in the json output + string(JSON conan_generators_folder GET "${conan_stdout}" graph nodes 0 generators_folder) + cmake_path(CONVERT ${conan_generators_folder} TO_CMAKE_PATH_LIST conan_generators_folder) + + message(STATUS "CMake-Conan: CONAN_GENERATORS_FOLDER=${conan_generators_folder}") + set_property(GLOBAL PROPERTY CONAN_GENERATORS_FOLDER "${conan_generators_folder}") + # reconfigure on conanfile changes + string(JSON conanfile GET "${conan_stdout}" graph nodes 0 label) + message(STATUS "CMake-Conan: CONANFILE=${CMAKE_SOURCE_DIR}/${conanfile}") + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/${conanfile}") + # success + set_property(GLOBAL PROPERTY CONAN_INSTALL_SUCCESS TRUE) + +endfunction() + + +function(conan_get_version conan_command conan_current_version) + execute_process( + COMMAND ${conan_command} --version + OUTPUT_VARIABLE conan_output + RESULT_VARIABLE conan_result + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(conan_result) + message(FATAL_ERROR "CMake-Conan: Error when trying to run Conan") + endif() + + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" conan_version ${conan_output}) + set(${conan_current_version} ${conan_version} PARENT_SCOPE) +endfunction() + + +function(conan_version_check) + set(options ) + set(one_value_args MINIMUM CURRENT) + set(multi_value_args ) + cmake_parse_arguments(conan_version_check + "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + if(NOT conan_version_check_MINIMUM) + message(FATAL_ERROR "CMake-Conan: Required parameter MINIMUM not set!") + endif() + if(NOT conan_version_check_CURRENT) + message(FATAL_ERROR "CMake-Conan: Required parameter CURRENT not set!") + endif() + + if(conan_version_check_CURRENT VERSION_LESS conan_version_check_MINIMUM) + message(FATAL_ERROR "CMake-Conan: Conan version must be ${conan_version_check_MINIMUM} or later") + endif() +endfunction() + + +macro(construct_profile_argument argument_variable profile_list) + set(${argument_variable} "") + if("${profile_list}" STREQUAL "CONAN_HOST_PROFILE") + set(_arg_flag "--profile:host=") + elseif("${profile_list}" STREQUAL "CONAN_BUILD_PROFILE") + set(_arg_flag "--profile:build=") + endif() + + set(_profile_list "${${profile_list}}") + list(TRANSFORM _profile_list REPLACE "auto-cmake" "${CMAKE_BINARY_DIR}/conan_host_profile") + list(TRANSFORM _profile_list PREPEND ${_arg_flag}) + set(${argument_variable} ${_profile_list}) + + unset(_arg_flag) + unset(_profile_list) +endmacro() + + +macro(conan_provide_dependency method package_name) + set_property(GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED TRUE) + get_property(_conan_install_success GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) + if(NOT _conan_install_success) + find_program(CONAN_COMMAND "conan" REQUIRED) + conan_get_version(${CONAN_COMMAND} CONAN_CURRENT_VERSION) + conan_version_check(MINIMUM ${CONAN_MINIMUM_VERSION} CURRENT ${CONAN_CURRENT_VERSION}) + message(STATUS "CMake-Conan: first find_package() found. Installing dependencies with Conan") + if("default" IN_LIST CONAN_HOST_PROFILE OR "default" IN_LIST CONAN_BUILD_PROFILE) + conan_profile_detect_default() + endif() + if("auto-cmake" IN_LIST CONAN_HOST_PROFILE) + detect_host_profile(${CMAKE_BINARY_DIR}/conan_host_profile) + endif() + construct_profile_argument(_host_profile_flags CONAN_HOST_PROFILE) + construct_profile_argument(_build_profile_flags CONAN_BUILD_PROFILE) + if(EXISTS "${CMAKE_SOURCE_DIR}/conanfile.py") + file(READ "${CMAKE_SOURCE_DIR}/conanfile.py" outfile) + if(NOT "${outfile}" MATCHES ".*CMakeDeps.*") + message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile") + endif() + set(generator "") + elseif (EXISTS "${CMAKE_SOURCE_DIR}/conanfile.txt") + file(READ "${CMAKE_SOURCE_DIR}/conanfile.txt" outfile) + if(NOT "${outfile}" MATCHES ".*CMakeDeps.*") + message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile. " + "Please define the generator as it will be mandatory in the future") + endif() + set(generator "-g;CMakeDeps") + endif() + get_property(_multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT _multiconfig_generator) + message(STATUS "CMake-Conan: Installing single configuration ${CMAKE_BUILD_TYPE}") + conan_install(${_host_profile_flags} ${_build_profile_flags} ${CONAN_INSTALL_ARGS} ${generator}) + else() + message(STATUS "CMake-Conan: Installing both Debug and Release") + conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Release ${CONAN_INSTALL_ARGS} ${generator}) + conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Debug ${CONAN_INSTALL_ARGS} ${generator}) + endif() + unset(_host_profile_flags) + unset(_build_profile_flags) + unset(_multiconfig_generator) + unset(_conan_install_success) + else() + message(STATUS "CMake-Conan: find_package(${ARGV1}) found, 'conan install' already ran") + unset(_conan_install_success) + endif() + + get_property(_conan_generators_folder GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) + + # Ensure that we consider Conan-provided packages ahead of any other, + # irrespective of other settings that modify the search order or search paths + # This follows the guidelines from the find_package documentation + # (https://cmake.org/cmake/help/latest/command/find_package.html): + # find_package ( PATHS paths... NO_DEFAULT_PATH) + # find_package () + + # Filter out `REQUIRED` from the argument list, as the first call may fail + set(_find_args_${package_name} "${ARGN}") + list(REMOVE_ITEM _find_args_${package_name} "REQUIRED") + if(NOT "MODULE" IN_LIST _find_args_${package_name}) + find_package(${package_name} ${_find_args_${package_name}} BYPASS_PROVIDER PATHS "${_conan_generators_folder}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + unset(_find_args_${package_name}) + endif() + + # Invoke find_package a second time - if the first call succeeded, + # this will simply reuse the result. If not, fall back to CMake default search + # behaviour, also allowing modules to be searched. + if(NOT ${package_name}_FOUND) + list(FIND CMAKE_MODULE_PATH "${_conan_generators_folder}" _index) + if(_index EQUAL -1) + list(PREPEND CMAKE_MODULE_PATH "${_conan_generators_folder}") + endif() + unset(_index) + find_package(${package_name} ${ARGN} BYPASS_PROVIDER) + list(REMOVE_ITEM CMAKE_MODULE_PATH "${_conan_generators_folder}") + endif() +endmacro() + + +cmake_language( + SET_DEPENDENCY_PROVIDER conan_provide_dependency + SUPPORTED_METHODS FIND_PACKAGE +) + + +macro(conan_provide_dependency_check) + set(_conan_provide_dependency_invoked FALSE) + get_property(_conan_provide_dependency_invoked GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED) + if(NOT _conan_provide_dependency_invoked) + message(WARNING "Conan is correctly configured as dependency provider, " + "but Conan has not been invoked. Please add at least one " + "call to `find_package()`.") + if(DEFINED CONAN_COMMAND) + # supress warning in case `CONAN_COMMAND` was specified but unused. + set(_conan_command ${CONAN_COMMAND}) + unset(_conan_command) + endif() + endif() + unset(_conan_provide_dependency_invoked) +endmacro() + + +# Add a deferred call at the end of processing the top-level directory +# to check if the dependency provider was invoked at all. +cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}" CALL conan_provide_dependency_check) + +# Configurable variables for Conan profiles +set(CONAN_HOST_PROFILE "default;auto-cmake" CACHE STRING "Conan host profile") +set(CONAN_BUILD_PROFILE "default" CACHE STRING "Conan build profile") +set(CONAN_INSTALL_ARGS "--build=missing" CACHE STRING "Command line arguments for conan install") + +find_program(_cmake_program NAMES cmake NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH) +if(NOT _cmake_program) + get_filename_component(PATH_TO_CMAKE_BIN "${CMAKE_COMMAND}" DIRECTORY) + set(PATH_TO_CMAKE_BIN "${PATH_TO_CMAKE_BIN}" CACHE INTERNAL "Path where the CMake executable is") +endif() + +cmake_policy(POP) diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 0000000..b5e2fea --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,11 @@ +[requires] +catch2/2.13.10 +approvaltests.cpp/10.12.2 +fmt/11.0.0 +ctre/3.7.1 + +[layout] +cmake_layout + +[generators] +CMakeDeps diff --git a/known-leaks.txt b/known-leaks.txt new file mode 100644 index 0000000..00fb36e --- /dev/null +++ b/known-leaks.txt @@ -0,0 +1 @@ +leak:std::locale::locale diff --git a/resources/asmtext_filter_tests.ce-bug-3963.approved.txt b/resources/asmtext_filter_tests.ce-bug-3963.approved.txt index 0a3b245..ecf1231 100644 --- a/resources/asmtext_filter_tests.ce-bug-3963.approved.txt +++ b/resources/asmtext_filter_tests.ce-bug-3963.approved.txt @@ -1 +1 @@ -{"asm": [{"labels": [], "source": null, "section": ".plt", "text": "std::ostream::put(char)@plt-0x10:"},{"labels": [], "opcodes": ["ff", "35", "e2", "2f", "00", "00"], "address": 4198432, "source": null, "section": ".plt", "text": " push QWORD PTR [rip+0x2fe2] # 404008 <_GLOBAL_OFFSET_TABLE_+0x8>"},{"labels": [], "opcodes": ["ff", "25", "e4", "2f", "00", "00"], "address": 4198438, "source": null, "section": ".plt", "text": " jmp QWORD PTR [rip+0x2fe4] # 404010 <_GLOBAL_OFFSET_TABLE_+0x10>"},{"labels": [], "opcodes": ["0f", "1f", "40", "00"], "address": 4198444, "source": null, "section": ".plt", "text": " nop DWORD PTR [rax+0x0]"},{"labels": [], "source": null, "section": ".text", "text": "main:"},{"labels": [], "opcodes": ["55"], "address": 4198592, "source": {"file": null, "mainsource": "true", "line": 15}, "section": ".text", "text": " push rbp"},{"labels": [], "opcodes": ["ba", "0a", "00", "00", "00"], "address": 4198593, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " mov edx,0xa"},{"labels": [], "opcodes": ["31", "f6"], "address": 4198598, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " xor esi,esi"},{"labels": [], "opcodes": ["bf", "04", "20", "40", "00"], "address": 4198600, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " mov edi,0x402004"},{"labels": [], "opcodes": ["53"], "address": 4198605, "source": {"file": null, "mainsource": "true", "line": 15}, "section": ".text", "text": " push rbx"},{"labels": [], "opcodes": ["48", "83", "ec", "08"], "address": 4198606, "source": {"file": null, "mainsource": "true", "line": 15}, "section": ".text", "text": " sub rsp,0x8"},{"labels": [], "opcodes": ["e8", "a9", "ff", "ff", "ff"], "address": 4198610, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " call 401080 "},{"labels": [], "opcodes": ["bf", "80", "40", "40", "00"], "address": 4198615, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " mov edi,0x404080"},{"labels": [], "opcodes": ["89", "c6"], "address": 4198620, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " mov esi,eax"},{"labels": [], "opcodes": ["e8", "bd", "ff", "ff", "ff"], "address": 4198622, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " call 4010a0 "},{"labels": [], "opcodes": ["48", "89", "c3"], "address": 4198627, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " mov rbx,rax"},{"labels": [], "opcodes": ["48", "8b", "00"], "address": 4198630, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rax,QWORD PTR [rax]"},{"labels": [], "opcodes": ["48", "8b", "40", "e8"], "address": 4198633, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rax,QWORD PTR [rax-0x18]"},{"labels": [], "opcodes": ["48", "8b", "ac", "03", "f0", "00", "00", "00"], "address": 4198637, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rbp,QWORD PTR [rbx+rax*1+0xf0]"},{"labels": [], "opcodes": ["48", "85", "ed"], "address": 4198645, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 49}, "section": ".text", "text": " test rbp,rbp"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["74", "4f"], "address": 4198648, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 49}, "section": ".text", "text": " je 401149 "},{"labels": [], "opcodes": ["80", "7d", "38", "00"], "address": 4198650, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 882}, "section": ".text", "text": " cmp BYTE PTR [rbp+0x38],0x0"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["74", "1d"], "address": 4198654, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 882}, "section": ".text", "text": " je 40111d "},{"labels": [], "opcodes": ["0f", "be", "75", "43"], "address": 4198656, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 883}, "section": ".text", "text": " movsx esi,BYTE PTR [rbp+0x43]"},{"labels": [], "opcodes": ["48", "89", "df"], "address": 4198660, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rdi,rbx"},{"labels": [], "opcodes": ["e8", "24", "ff", "ff", "ff"], "address": 4198663, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " call 401030 "},{"labels": [], "opcodes": ["48", "89", "c7"], "address": 4198668, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rdi,rax"},{"labels": [], "opcodes": ["e8", "2c", "ff", "ff", "ff"], "address": 4198671, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 711}, "section": ".text", "text": " call 401040 "},{"labels": [], "opcodes": ["48", "83", "c4", "08"], "address": 4198676, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " add rsp,0x8"},{"labels": [], "opcodes": ["31", "c0"], "address": 4198680, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " xor eax,eax"},{"labels": [], "opcodes": ["5b"], "address": 4198682, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " pop rbx"},{"labels": [], "opcodes": ["5d"], "address": 4198683, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " pop rbp"},{"labels": [], "opcodes": ["c3"], "address": 4198684, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " ret "},{"labels": [], "opcodes": ["48", "89", "ef"], "address": 4198685, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 884}, "section": ".text", "text": " mov rdi,rbp"},{"labels": [{"name": "char", "range": {"startCol": 28, "endCol": 32}}], "opcodes": ["e8", "3b", "ff", "ff", "ff"], "address": 4198688, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 884}, "section": ".text", "text": " call 401060 ::_M_widen_init() const@plt>"},{"labels": [], "opcodes": ["48", "8b", "45", "00"], "address": 4198693, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov rax,QWORD PTR [rbp+0x0]"},{"labels": [], "opcodes": ["be", "0a", "00", "00", "00"], "address": 4198697, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov esi,0xa"},{"labels": [], "opcodes": ["48", "8b", "40", "30"], "address": 4198702, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov rax,QWORD PTR [rax+0x30]"},{"labels": [], "opcodes": ["48", "3d", "c0", "12", "40", "00"], "address": 4198706, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " cmp rax,0x4012c0"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["74", "ca"], "address": 4198712, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " je 401104 "},{"labels": [], "opcodes": ["be", "0a", "00", "00", "00"], "address": 4198714, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov esi,0xa"},{"labels": [], "opcodes": ["48", "89", "ef"], "address": 4198719, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov rdi,rbp"},{"labels": [], "opcodes": ["ff", "d0"], "address": 4198722, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " call rax"},{"labels": [], "opcodes": ["0f", "be", "f0"], "address": 4198724, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " movsx esi,al"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["eb", "bb"], "address": 4198727, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " jmp 401104 "},{"labels": [], "opcodes": ["e8", "22", "ff", "ff", "ff"], "address": 4198729, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 50}, "section": ".text", "text": " call 401070 "},{"labels": [], "opcodes": ["66", "90"], "address": 4198734, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 50}, "section": ".text", "text": " xchg ax,ax"},{"labels": [], "address": 4198736, "source": null, "section": ".text", "text": "_GLOBAL__sub_I__Zli3_kmPKc:"},{"labels": [], "opcodes": ["48", "83", "ec", "08"], "address": 4198736, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " sub rsp,0x8"},{"labels": [], "opcodes": ["bf", "91", "41", "40", "00"], "address": 4198740, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov edi,0x404191"},{"labels": [], "opcodes": ["e8", "32", "ff", "ff", "ff"], "address": 4198745, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " call 401090 "},{"labels": [], "opcodes": ["ba", "68", "40", "40", "00"], "address": 4198750, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov edx,0x404068"},{"labels": [], "opcodes": ["be", "91", "41", "40", "00"], "address": 4198755, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov esi,0x404191"},{"labels": [], "opcodes": ["bf", "b0", "10", "40", "00"], "address": 4198760, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov edi,0x4010b0"},{"labels": [], "opcodes": ["48", "83", "c4", "08"], "address": 4198765, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " add rsp,0x8"},{"labels": [], "opcodes": ["e9", "da", "fe", "ff", "ff"], "address": 4198769, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " jmp 401050 <__cxa_atexit@plt>"},{"labels": [], "opcodes": ["66", "2e", "0f", "1f", "84", "00", "00", "00", "00", "00"], "address": 4198774, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " cs nop WORD PTR [rax+rax*1+0x0]"},{"labels": [], "source": null, "section": ".text", "text": "operator\"\" _km(char const*):"},{"labels": [], "opcodes": ["48", "83", "ec", "08"], "address": 4199024, "source": {"file": null, "mainsource": "true", "line": 7}, "section": ".text", "text": " sub rsp,0x8"},{"labels": [], "opcodes": ["ba", "0a", "00", "00", "00"], "address": 4199028, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " mov edx,0xa"},{"labels": [], "opcodes": ["31", "f6"], "address": 4199033, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " xor esi,esi"},{"labels": [], "opcodes": ["e8", "00", "fe", "ff", "ff"], "address": 4199035, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " call 401080 "},{"labels": [], "opcodes": ["48", "83", "c4", "08"], "address": 4199040, "source": {"file": null, "mainsource": "true", "line": 9}, "section": ".text", "text": " add rsp,0x8"},{"labels": [], "opcodes": ["c3"], "address": 4199044, "source": {"file": null, "mainsource": "true", "line": 9}, "section": ".text", "text": " ret "},{"labels": [], "opcodes": ["66", "66", "2e", "0f", "1f", "84", "00", "00", "00", "00", "00"], "address": 4199045, "source": {"file": null, "mainsource": "true", "line": 9}, "section": ".text", "text": " data16 cs nop WORD PTR [rax+rax*1+0x0]"},{"labels": [], "address": 4199056, "source": null, "section": ".text", "text": "operator\"\" _km(long double):"},{"labels": [], "opcodes": ["d9", "7c", "24", "f6"], "address": 4199056, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fnstcw WORD PTR [rsp-0xa]"},{"labels": [], "opcodes": ["db", "6c", "24", "08"], "address": 4199060, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fld TBYTE PTR [rsp+0x8]"},{"labels": [], "opcodes": ["0f", "b7", "44", "24", "f6"], "address": 4199064, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " movzx eax,WORD PTR [rsp-0xa]"},{"labels": [], "opcodes": ["80", "cc", "0c"], "address": 4199069, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " or ah,0xc"},{"labels": [], "opcodes": ["66", "89", "44", "24", "f4"], "address": 4199072, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " mov WORD PTR [rsp-0xc],ax"},{"labels": [], "opcodes": ["d9", "6c", "24", "f4"], "address": 4199077, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fldcw WORD PTR [rsp-0xc]"},{"labels": [], "opcodes": ["db", "5c", "24", "f0"], "address": 4199081, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fistp DWORD PTR [rsp-0x10]"},{"labels": [], "opcodes": ["d9", "6c", "24", "f6"], "address": 4199085, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fldcw WORD PTR [rsp-0xa]"},{"labels": [], "opcodes": ["8b", "44", "24", "f0"], "address": 4199089, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " mov eax,DWORD PTR [rsp-0x10]"},{"labels": [], "opcodes": ["c3"], "address": 4199093, "source": {"file": null, "mainsource": "true", "line": 13}, "section": ".text", "text": " ret "},{"labels": [], "opcodes": ["66", "2e", "0f", "1f", "84", "00", "00", "00", "00", "00"], "address": 4199094, "source": {"file": null, "mainsource": "true", "line": 13}, "section": ".text", "text": " cs nop WORD PTR [rax+rax*1+0x0]"}],"labelDefinitions": {"std::ostream::put(char)@plt-0x10": 1, "main": 5, "_GLOBAL__sub_I__Zli3_kmPKc": 48, "operator\"\" _km(char const*)": 58, "operator\"\" _km(long double)": 66}} +{"asm": [{"labels": [], "source": null, "section": ".text", "text": "main:"},{"labels": [], "opcodes": ["55"], "address": 4198592, "source": {"file": null, "mainsource": "true", "line": 15}, "section": ".text", "text": " push rbp"},{"labels": [], "opcodes": ["ba", "0a", "00", "00", "00"], "address": 4198593, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " mov edx,0xa"},{"labels": [], "opcodes": ["31", "f6"], "address": 4198598, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " xor esi,esi"},{"labels": [], "opcodes": ["bf", "04", "20", "40", "00"], "address": 4198600, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " mov edi,0x402004"},{"labels": [], "opcodes": ["53"], "address": 4198605, "source": {"file": null, "mainsource": "true", "line": 15}, "section": ".text", "text": " push rbx"},{"labels": [], "opcodes": ["48", "83", "ec", "08"], "address": 4198606, "source": {"file": null, "mainsource": "true", "line": 15}, "section": ".text", "text": " sub rsp,0x8"},{"labels": [], "opcodes": ["e8", "a9", "ff", "ff", "ff"], "address": 4198610, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " call 401080 "},{"labels": [], "opcodes": ["bf", "80", "40", "40", "00"], "address": 4198615, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " mov edi,0x404080"},{"labels": [], "opcodes": ["89", "c6"], "address": 4198620, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " mov esi,eax"},{"labels": [], "opcodes": ["e8", "bd", "ff", "ff", "ff"], "address": 4198622, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " call 4010a0 "},{"labels": [], "opcodes": ["48", "89", "c3"], "address": 4198627, "source": {"file": null, "mainsource": "true", "line": 17}, "section": ".text", "text": " mov rbx,rax"},{"labels": [], "opcodes": ["48", "8b", "00"], "address": 4198630, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rax,QWORD PTR [rax]"},{"labels": [], "opcodes": ["48", "8b", "40", "e8"], "address": 4198633, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rax,QWORD PTR [rax-0x18]"},{"labels": [], "opcodes": ["48", "8b", "ac", "03", "f0", "00", "00", "00"], "address": 4198637, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rbp,QWORD PTR [rbx+rax*1+0xf0]"},{"labels": [], "opcodes": ["48", "85", "ed"], "address": 4198645, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 49}, "section": ".text", "text": " test rbp,rbp"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["74", "4f"], "address": 4198648, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 49}, "section": ".text", "text": " je 401149 "},{"labels": [], "opcodes": ["80", "7d", "38", "00"], "address": 4198650, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 882}, "section": ".text", "text": " cmp BYTE PTR [rbp+0x38],0x0"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["74", "1d"], "address": 4198654, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 882}, "section": ".text", "text": " je 40111d "},{"labels": [], "opcodes": ["0f", "be", "75", "43"], "address": 4198656, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 883}, "section": ".text", "text": " movsx esi,BYTE PTR [rbp+0x43]"},{"labels": [], "opcodes": ["48", "89", "df"], "address": 4198660, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rdi,rbx"},{"labels": [], "opcodes": ["e8", "24", "ff", "ff", "ff"], "address": 4198663, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " call 401030 "},{"labels": [], "opcodes": ["48", "89", "c7"], "address": 4198668, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 689}, "section": ".text", "text": " mov rdi,rax"},{"labels": [], "opcodes": ["e8", "2c", "ff", "ff", "ff"], "address": 4198671, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/ostream", "mainsource": "false", "line": 711}, "section": ".text", "text": " call 401040 "},{"labels": [], "opcodes": ["48", "83", "c4", "08"], "address": 4198676, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " add rsp,0x8"},{"labels": [], "opcodes": ["31", "c0"], "address": 4198680, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " xor eax,eax"},{"labels": [], "opcodes": ["5b"], "address": 4198682, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " pop rbx"},{"labels": [], "opcodes": ["5d"], "address": 4198683, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " pop rbp"},{"labels": [], "opcodes": ["c3"], "address": 4198684, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " ret "},{"labels": [], "opcodes": ["48", "89", "ef"], "address": 4198685, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 884}, "section": ".text", "text": " mov rdi,rbp"},{"labels": [{"name": "char", "range": {"startCol": 28, "endCol": 32}}], "opcodes": ["e8", "3b", "ff", "ff", "ff"], "address": 4198688, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 884}, "section": ".text", "text": " call 401060 ::_M_widen_init() const@plt>"},{"labels": [], "opcodes": ["48", "8b", "45", "00"], "address": 4198693, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov rax,QWORD PTR [rbp+0x0]"},{"labels": [], "opcodes": ["be", "0a", "00", "00", "00"], "address": 4198697, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov esi,0xa"},{"labels": [], "opcodes": ["48", "8b", "40", "30"], "address": 4198702, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov rax,QWORD PTR [rax+0x30]"},{"labels": [], "opcodes": ["48", "3d", "c0", "12", "40", "00"], "address": 4198706, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " cmp rax,0x4012c0"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["74", "ca"], "address": 4198712, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " je 401104 "},{"labels": [], "opcodes": ["be", "0a", "00", "00", "00"], "address": 4198714, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov esi,0xa"},{"labels": [], "opcodes": ["48", "89", "ef"], "address": 4198719, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " mov rdi,rbp"},{"labels": [], "opcodes": ["ff", "d0"], "address": 4198722, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " call rax"},{"labels": [], "opcodes": ["0f", "be", "f0"], "address": 4198724, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " movsx esi,al"},{"labels": [{"name": "main", "range": {"startCol": 17, "endCol": 21}}], "opcodes": ["eb", "bb"], "address": 4198727, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/locale_facets.h", "mainsource": "false", "line": 885}, "section": ".text", "text": " jmp 401104 "},{"labels": [], "opcodes": ["e8", "22", "ff", "ff", "ff"], "address": 4198729, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 50}, "section": ".text", "text": " call 401070 "},{"labels": [], "opcodes": ["66", "90"], "address": 4198734, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/bits/basic_ios.h", "mainsource": "false", "line": 50}, "section": ".text", "text": " xchg ax,ax"},{"labels": [], "address": 4198736, "source": null, "section": ".text", "text": "_GLOBAL__sub_I__Zli3_kmPKc:"},{"labels": [], "opcodes": ["48", "83", "ec", "08"], "address": 4198736, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " sub rsp,0x8"},{"labels": [], "opcodes": ["bf", "91", "41", "40", "00"], "address": 4198740, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov edi,0x404191"},{"labels": [], "opcodes": ["e8", "32", "ff", "ff", "ff"], "address": 4198745, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " call 401090 "},{"labels": [], "opcodes": ["ba", "68", "40", "40", "00"], "address": 4198750, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov edx,0x404068"},{"labels": [], "opcodes": ["be", "91", "41", "40", "00"], "address": 4198755, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov esi,0x404191"},{"labels": [], "opcodes": ["bf", "b0", "10", "40", "00"], "address": 4198760, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " mov edi,0x4010b0"},{"labels": [], "opcodes": ["48", "83", "c4", "08"], "address": 4198765, "source": {"file": null, "mainsource": "true", "line": 18}, "section": ".text", "text": " add rsp,0x8"},{"labels": [], "opcodes": ["e9", "da", "fe", "ff", "ff"], "address": 4198769, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " jmp 401050 <__cxa_atexit@plt>"},{"labels": [], "opcodes": ["66", "2e", "0f", "1f", "84", "00", "00", "00", "00", "00"], "address": 4198774, "source": {"file": "/opt/compiler-explorer/gcc-trunk-20220526/include/c++/13.0.0/iostream", "mainsource": "false", "line": 74}, "section": ".text", "text": " cs nop WORD PTR [rax+rax*1+0x0]"},{"labels": [], "source": null, "section": ".text", "text": "operator\"\" _km(char const*):"},{"labels": [], "opcodes": ["48", "83", "ec", "08"], "address": 4199024, "source": {"file": null, "mainsource": "true", "line": 7}, "section": ".text", "text": " sub rsp,0x8"},{"labels": [], "opcodes": ["ba", "0a", "00", "00", "00"], "address": 4199028, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " mov edx,0xa"},{"labels": [], "opcodes": ["31", "f6"], "address": 4199033, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " xor esi,esi"},{"labels": [], "opcodes": ["e8", "00", "fe", "ff", "ff"], "address": 4199035, "source": {"file": "/usr/include/stdlib.h", "mainsource": "false", "line": 363}, "section": ".text", "text": " call 401080 "},{"labels": [], "opcodes": ["48", "83", "c4", "08"], "address": 4199040, "source": {"file": null, "mainsource": "true", "line": 9}, "section": ".text", "text": " add rsp,0x8"},{"labels": [], "opcodes": ["c3"], "address": 4199044, "source": {"file": null, "mainsource": "true", "line": 9}, "section": ".text", "text": " ret "},{"labels": [], "opcodes": ["66", "66", "2e", "0f", "1f", "84", "00", "00", "00", "00", "00"], "address": 4199045, "source": {"file": null, "mainsource": "true", "line": 9}, "section": ".text", "text": " data16 cs nop WORD PTR [rax+rax*1+0x0]"},{"labels": [], "address": 4199056, "source": null, "section": ".text", "text": "operator\"\" _km(long double):"},{"labels": [], "opcodes": ["d9", "7c", "24", "f6"], "address": 4199056, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fnstcw WORD PTR [rsp-0xa]"},{"labels": [], "opcodes": ["db", "6c", "24", "08"], "address": 4199060, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fld TBYTE PTR [rsp+0x8]"},{"labels": [], "opcodes": ["0f", "b7", "44", "24", "f6"], "address": 4199064, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " movzx eax,WORD PTR [rsp-0xa]"},{"labels": [], "opcodes": ["80", "cc", "0c"], "address": 4199069, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " or ah,0xc"},{"labels": [], "opcodes": ["66", "89", "44", "24", "f4"], "address": 4199072, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " mov WORD PTR [rsp-0xc],ax"},{"labels": [], "opcodes": ["d9", "6c", "24", "f4"], "address": 4199077, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fldcw WORD PTR [rsp-0xc]"},{"labels": [], "opcodes": ["db", "5c", "24", "f0"], "address": 4199081, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fistp DWORD PTR [rsp-0x10]"},{"labels": [], "opcodes": ["d9", "6c", "24", "f6"], "address": 4199085, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " fldcw WORD PTR [rsp-0xa]"},{"labels": [], "opcodes": ["8b", "44", "24", "f0"], "address": 4199089, "source": {"file": null, "mainsource": "true", "line": 12}, "section": ".text", "text": " mov eax,DWORD PTR [rsp-0x10]"},{"labels": [], "opcodes": ["c3"], "address": 4199093, "source": {"file": null, "mainsource": "true", "line": 13}, "section": ".text", "text": " ret "},{"labels": [], "opcodes": ["66", "2e", "0f", "1f", "84", "00", "00", "00", "00", "00"], "address": 4199094, "source": {"file": null, "mainsource": "true", "line": 13}, "section": ".text", "text": " cs nop WORD PTR [rax+rax*1+0x0]"}],"labelDefinitions": {"main": 1, "_GLOBAL__sub_I__Zli3_kmPKc": 44, "operator\"\" _km(char const*)": 54, "operator\"\" _km(long double)": 62}} diff --git a/setup.sh b/setup.sh index 0320671..fb456c3 100755 --- a/setup.sh +++ b/setup.sh @@ -1,7 +1,12 @@ #!/bin/sh -sudo -H apt install -y python3 python3-pip python3-setuptools g++-9 patchelf -sudo -H pip3 install conan +python3 -m venv .venv -conan profile new default --detect -conan profile update settings.compiler.libcxx=libstdc++11 default +# sudo -H apt install -y python3 python3-pip python3-setuptools patchelf +.venv/bin/pip3 install conan + +.venv/bin/conan profile detect + +sed -i 's/compiler\.cppstd=.*/compiler.cppstd=20/g' ~/.conan2/profiles/default + +.venv/bin/conan install --build=fmt/11.0.0 . diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a4f2fe4..9ccb72b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,7 +6,12 @@ add_library(asm-parser-lib STATIC objdump/parser.cpp assembly/parser.cpp ) -target_link_libraries(asm-parser-lib PUBLIC ${CONAN_LIBS}) +find_package(ctre CONFIG REQUIRED) +find_package(Catch2 REQUIRED CONFIG) +find_package(fmt REQUIRED CONFIG) +find_package(ApprovalTests REQUIRED CONFIG) + +target_link_libraries(asm-parser-lib PUBLIC ctre::ctre Catch2::Catch2 fmt::fmt ApprovalTests::ApprovalTests) add_executable(asm-parser main.cpp) diff --git a/src/utils/regexes.hpp b/src/utils/regexes.hpp index 21eeeab..068232c 100644 --- a/src/utils/regexes.hpp +++ b/src/utils/regexes.hpp @@ -60,6 +60,8 @@ struct Regexes static constexpr auto binaryIgnoreFunction = ctre::search; + + static constexpr auto pltFunction = ctre::search; }; diff --git a/src/utils/regexwrappers.cpp b/src/utils/regexwrappers.cpp index 19451f4..f3d7ecb 100644 --- a/src/utils/regexwrappers.cpp +++ b/src/utils/regexwrappers.cpp @@ -660,7 +660,7 @@ bool AsmParser::AssemblyTextParserUtils::shouldIgnoreFunction(std::string_view n } else if (filter.plt) { - return (name.ends_with("@plt") || name.ends_with("@plt>")); + return (name.ends_with("@plt") || name.ends_with("@plt>")) || (Regexes::pltFunction(name)); } else { diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index f7602d8..ede0e48 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -14,7 +14,7 @@ int8_t AsmParser::hex2int(const char c) } else { - return 10 + (c - 'a'); + return static_cast(10 + (c - 'a')); } } diff --git a/test7000.sh b/test7000.sh new file mode 100755 index 0000000..778f16c --- /dev/null +++ b/test7000.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +CURDIR=$PWD + +cd build/src +# cat $CURDIR/resources/ce-bug-3963.asm | asm-parser -plt -stdin -binary -dont_mask_filenames -outputtext + + +LSAN_OPTIONS=suppressions=$CURDIR/known-leaks.txt ./asm-parser -plt -binary -dont_mask_filenames $CURDIR/resources/ce-bug-7000.asm > $CURDIR/cetest.json + +cd $CURDIR