diff options
Diffstat (limited to 'tools')
43 files changed, 1642 insertions, 1718 deletions
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 86b9621a198e..7b26f5907a86 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -8,3 +8,4 @@ add_subdirectory(lldb-mi) if (LLDB_CAN_USE_LLDB_SERVER) add_subdirectory(lldb-server) endif() +add_subdirectory(intel-mpx) diff --git a/tools/argdumper/CMakeLists.txt b/tools/argdumper/CMakeLists.txt index 9bf956396b4f..42f1dd51582a 100644 --- a/tools/argdumper/CMakeLists.txt +++ b/tools/argdumper/CMakeLists.txt @@ -2,12 +2,9 @@ include(${LLDB_PROJECT_ROOT}/cmake/LLDBDependencies.cmake) add_lldb_tool(lldb-argdumper INCLUDE_IN_FRAMEWORK argdumper.cpp - ) -if (LLDB_LINKER_SUPPORTS_GROUPS) - target_link_libraries(lldb-argdumper -Wl,--start-group ${LLDB_USED_LIBS} -Wl,--end-group) -else() - target_link_libraries(lldb-argdumper ${LLDB_USED_LIBS}) -endif() -llvm_config(lldb-argdumper ${LLVM_LINK_COMPONENTS}) + LINK_LIBS + lldbCore + lldbUtility + ) diff --git a/tools/argdumper/argdumper.cpp b/tools/argdumper/argdumper.cpp index 01a070efb82c..67fd309fa14c 100644 --- a/tools/argdumper/argdumper.cpp +++ b/tools/argdumper/argdumper.cpp @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#include "lldb/Core/StreamString.h" #include "lldb/Utility/JSON.h" +#include "lldb/Utility/StreamString.h" #include <iostream> diff --git a/tools/debugserver/debugserver.xcodeproj/project.pbxproj b/tools/debugserver/debugserver.xcodeproj/project.pbxproj index a4c3de58113e..e0d1b68db702 100644 --- a/tools/debugserver/debugserver.xcodeproj/project.pbxproj +++ b/tools/debugserver/debugserver.xcodeproj/project.pbxproj @@ -94,12 +94,12 @@ 456F67641AD46CE9002850C2 /* CFBundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2695DD910D3EBFF6007E4CA2 /* CFBundle.cpp */; }; 456F67651AD46CE9002850C2 /* PseudoTerminal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF67ABFF0D34604D0022D128 /* PseudoTerminal.cpp */; }; 456F67671AD46CE9002850C2 /* DNBArch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 264D5D571293835600ED4C01 /* DNBArch.cpp */; }; - 456F67681AD46CE9002850C2 /* HasAVX.s in Sources */ = {isa = PBXBuildFile; fileRef = 4971AE7113D10F4F00649E37 /* HasAVX.s */; }; 456F67691AD46CE9002850C2 /* DNBArchImplARM64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266B5ECF1460A68200E43F0A /* DNBArchImplARM64.cpp */; }; 456F676B1AD46CE9002850C2 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26ACA3340D3E956300A2120B /* CoreFoundation.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - 4971AE7213D10F4F00649E37 /* HasAVX.s in Sources */ = {isa = PBXBuildFile; fileRef = 4971AE7113D10F4F00649E37 /* HasAVX.s */; }; + 49D404621E39260F00570CDC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49D404611E39260F00570CDC /* Foundation.framework */; }; AF48558C1D75126800D19C07 /* StdStringExtractor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF48558B1D75126800D19C07 /* StdStringExtractor.cpp */; }; AF48558D1D75127500D19C07 /* StdStringExtractor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF48558B1D75126800D19C07 /* StdStringExtractor.cpp */; }; + AFA3FCA11E39984900218D5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49D404611E39260F00570CDC /* Foundation.framework */; }; AFEC3364194A8B0B00FF05C6 /* Genealogy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AFEC3363194A8B0B00FF05C6 /* Genealogy.cpp */; }; /* End PBXBuildFile section */ @@ -208,8 +208,7 @@ 26CF99A31142EB7400011AAB /* DNBArchImplX86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNBArchImplX86_64.h; sourceTree = "<group>"; }; 26E6B9DA0D1329010037ECDD /* RNBDefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNBDefs.h; sourceTree = "<group>"; }; 456F67721AD46CE9002850C2 /* debugserver-nonui */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "debugserver-nonui"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4971AE7013D10F4F00649E37 /* HasAVX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HasAVX.h; sourceTree = "<group>"; }; - 4971AE7113D10F4F00649E37 /* HasAVX.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = HasAVX.s; sourceTree = "<group>"; }; + 49D404611E39260F00570CDC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 49F530111331519C008956F6 /* MachRegisterStatesI386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MachRegisterStatesI386.h; sourceTree = "<group>"; }; 49F5301213316D7F008956F6 /* MachRegisterStatesX86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MachRegisterStatesX86_64.h; sourceTree = "<group>"; }; 9457ECF61419864100DFE7D8 /* stack_logging.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stack_logging.h; sourceTree = "<group>"; }; @@ -232,6 +231,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 49D404621E39260F00570CDC /* Foundation.framework in Frameworks */, 26CE05CF115C36F70022F371 /* CoreFoundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -241,6 +241,7 @@ buildActionMask = 2147483647; files = ( 456F676B1AD46CE9002850C2 /* CoreFoundation.framework in Frameworks */, + AFA3FCA11E39984900218D5E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -253,6 +254,7 @@ 26ACA3330D3E94F200A2120B /* Framework */, 26C637D50C71334A0024798E /* source */, 1AB674ADFE9D54B511CA2CBB /* Products */, + 49D404601E39260F00570CDC /* Frameworks */, ); name = dbgnub; sourceTree = "<group>"; @@ -407,8 +409,6 @@ 26C637E90C71334A0024798E /* i386 */, 26C637FA0C71334A0024798E /* ppc */, 26CF99A11142EB7400011AAB /* x86_64 */, - 4971AE7013D10F4F00649E37 /* HasAVX.h */, - 4971AE7113D10F4F00649E37 /* HasAVX.s */, 26C637E80C71334A0024798E /* dbgnub-mig.defs */, AFEC3363194A8B0B00FF05C6 /* Genealogy.cpp */, AF0934BA18E12B92005A11FD /* Genealogy.h */, @@ -483,6 +483,14 @@ sourceTree = "<group>"; usesTabs = 0; }; + 49D404601E39260F00570CDC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 49D404611E39260F00570CDC /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -612,7 +620,6 @@ 23562ED91D342B0000AB2BD4 /* LogMessage.cpp in Sources */, 26CE05F1115C387C0022F371 /* PseudoTerminal.cpp in Sources */, 264D5D581293835600ED4C01 /* DNBArch.cpp in Sources */, - 4971AE7213D10F4F00649E37 /* HasAVX.s in Sources */, 237821B01D4917D20028B7A1 /* LogFilterExactMatch.cpp in Sources */, 266B5ED11460A68200E43F0A /* DNBArchImplARM64.cpp in Sources */, ); @@ -665,7 +672,6 @@ 456F67641AD46CE9002850C2 /* CFBundle.cpp in Sources */, 456F67651AD46CE9002850C2 /* PseudoTerminal.cpp in Sources */, 456F67671AD46CE9002850C2 /* DNBArch.cpp in Sources */, - 456F67681AD46CE9002850C2 /* HasAVX.s in Sources */, 23AC04D01D2F58AF0072351D /* LogFilterRegex.cpp in Sources */, 456F67691AD46CE9002850C2 /* DNBArchImplARM64.cpp in Sources */, ); @@ -874,8 +880,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, @@ -976,8 +980,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, @@ -1077,8 +1079,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, @@ -1519,8 +1519,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, @@ -1661,8 +1659,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, @@ -1877,8 +1873,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, @@ -2010,8 +2004,6 @@ SpringBoardServices, "-framework", BackBoardServices, - "-framework", - Foundation, "-llockdown", "-framework", FrontBoardServices, diff --git a/tools/debugserver/source/CMakeLists.txt b/tools/debugserver/source/CMakeLists.txt index 43479bd36435..782c946f702f 100644 --- a/tools/debugserver/source/CMakeLists.txt +++ b/tools/debugserver/source/CMakeLists.txt @@ -2,12 +2,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/..) include_directories(${LLDB_SOURCE_DIR}/source) include_directories(MacOSX/DarwinLog) -if (CMAKE_SYSTEM_NAME MATCHES "Darwin") - include_directories(MacOSX) - #include_directories(${CMAKE_CURRENT_BINARY_DIR}/MacOSX) +include_directories(MacOSX) +#include_directories(${CMAKE_CURRENT_BINARY_DIR}/MacOSX) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/../resources/lldb-debugserver-Info.plist") -endif() +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/../resources/lldb-debugserver-Info.plist") check_cxx_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments" CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS) @@ -27,14 +25,31 @@ if (CXX_SUPPORTS_NO_EXTENDED_OFFSETOF) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-extended-offsetof") endif () -if (NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") - add_definitions( - -DDEBUGSERVER_VERSION_STR="${LLDB_VERSION}" - ) -endif () +find_library(COCOA_LIBRARY Cocoa) +add_subdirectory(MacOSX) -add_library(lldbDebugserverCommon - debugserver.cpp +set(generated_mach_interfaces + ${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h + ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c + ${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c + ) +add_custom_command(OUTPUT ${generated_mach_interfaces} + COMMAND mig ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs + ) + +set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c) +set_source_files_properties(${DEBUGSERVER_VERS_GENERATED_FILE} PROPERTIES GENERATED 1) + +add_custom_command(OUTPUT ${DEBUGSERVER_VERS_GENERATED_FILE} + COMMAND ${LLDB_SOURCE_DIR}/scripts/generate-vers.pl + ${LLDB_SOURCE_DIR}/lldb.xcodeproj/project.pbxproj debugserver + > ${DEBUGSERVER_VERS_GENERATED_FILE} + DEPENDS ${LLDB_SOURCE_DIR}/scripts/generate-vers.pl + ${LLDB_SOURCE_DIR}/lldb.xcodeproj/project.pbxproj + ) + +set(lldbDebugserverCommonSources DNBArch.cpp DNBBreakpoint.cpp DNB.cpp @@ -58,11 +73,54 @@ add_library(lldbDebugserverCommon RNBSocket.cpp SysSignal.cpp TTYState.cpp + + MacOSX/CFBundle.cpp + MacOSX/CFString.cpp + MacOSX/Genealogy.cpp + MacOSX/MachException.cpp + MacOSX/MachProcess.mm + MacOSX/MachTask.mm + MacOSX/MachThread.cpp + MacOSX/MachThreadList.cpp + MacOSX/MachVMMemory.cpp + MacOSX/MachVMRegion.cpp + MacOSX/OsLogger.cpp + ${generated_mach_interfaces} + ${DEBUGSERVER_VERS_GENERATED_FILE}) + +add_library(lldbDebugserverCommon ${lldbDebugserverCommonSources}) + +target_link_libraries(lldbDebugserverCommon + INTERFACE ${COCOA_LIBRARY} + lldbDebugserverMacOSX_I386 + lldbDebugserverMacOSX_X86_64 + lldbDebugserverMacOSX_DarwinLog) + +set(LLVM_OPTIONAL_SOURCES ${lldbDebugserverCommonSources}) +add_lldb_tool(debugserver INCLUDE_IN_FRAMEWORK + debugserver.cpp + + LINK_LIBS + lldbDebugserverCommon ) -if (CMAKE_SYSTEM_NAME MATCHES "Darwin") - find_library(COCOA_LIBRARY Cocoa) - target_link_libraries(lldbDebugserverCommon ${COCOA_LIBRARY}) - add_subdirectory(MacOSX) +set(LLDB_CODESIGN_IDENTITY "lldb_codesign" + CACHE STRING "Identity used for code signing. Set to empty string to skip the signing step.") +if (NOT ("${LLDB_CODESIGN_IDENTITY}" STREQUAL "")) + execute_process( + COMMAND xcrun -f codesign_allocate + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE CODESIGN_ALLOCATE + ) + add_custom_command(TARGET debugserver + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E env CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} + codesign --force --sign ${LLDB_CODESIGN_IDENTITY} + $<TARGET_FILE:debugserver> + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin + ) endif() + + + diff --git a/tools/debugserver/source/MacOSX/CMakeLists.txt b/tools/debugserver/source/MacOSX/CMakeLists.txt index 7b77eb25d554..59b39a1bff63 100644 --- a/tools/debugserver/source/MacOSX/CMakeLists.txt +++ b/tools/debugserver/source/MacOSX/CMakeLists.txt @@ -6,75 +6,3 @@ add_subdirectory(x86_64) add_subdirectory(DarwinLog) include_directories(..) - -set(generated_mach_interfaces - ${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h - ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c - ${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c - ) -add_custom_command(OUTPUT ${generated_mach_interfaces} - COMMAND mig ${CMAKE_CURRENT_SOURCE_DIR}/dbgnub-mig.defs - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dbgnub-mig.defs - ) - -set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c) -set_source_files_properties(${DEBUGSERVER_VERS_GENERATED_FILE} PROPERTIES GENERATED 1) - -add_custom_command(OUTPUT ${DEBUGSERVER_VERS_GENERATED_FILE} - COMMAND ${LLDB_SOURCE_DIR}/scripts/generate-vers.pl - ${LLDB_SOURCE_DIR}/lldb.xcodeproj/project.pbxproj debugserver - > ${DEBUGSERVER_VERS_GENERATED_FILE} - DEPENDS ${LLDB_SOURCE_DIR}/scripts/generate-vers.pl - ${LLDB_SOURCE_DIR}/lldb.xcodeproj/project.pbxproj - ) - -set(DEBUGSERVER_USED_LIBS - lldbDebugserverCommon - lldbUtility - lldbDebugserverMacOSX_I386 - lldbDebugserverMacOSX_X86_64 - lldbDebugserverMacOSX_DarwinLog - ) - -add_lldb_tool(debugserver INCLUDE_IN_FRAMEWORK - HasAVX.s - CFBundle.cpp - CFString.cpp - Genealogy.cpp - MachException.cpp - MachProcess.mm - MachTask.mm - MachThread.cpp - MachThreadList.cpp - MachVMMemory.cpp - MachVMRegion.cpp - OsLogger.cpp - ${generated_mach_interfaces} - ${DEBUGSERVER_VERS_GENERATED_FILE} - ) - -set_source_files_properties( - HasAVX.s - # Necessary since compilation will fail with stand-alone assembler - PROPERTIES LANGUAGE C COMPILE_FLAGS "-x assembler-with-cpp" - ) - -target_link_libraries(debugserver ${DEBUGSERVER_USED_LIBS}) - -set(LLDB_CODESIGN_IDENTITY "lldb_codesign" - CACHE STRING "Identity used for code signing. Set to empty string to skip the signing step.") -if (NOT ("${LLDB_CODESIGN_IDENTITY}" STREQUAL "")) - execute_process( - COMMAND xcrun -f codesign_allocate - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE CODESIGN_ALLOCATE - ) - add_custom_command(TARGET debugserver - POST_BUILD - # Note: --entitlements option removed (see comment above). - COMMAND ${CMAKE_COMMAND} -E env CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} - codesign --force --sign ${LLDB_CODESIGN_IDENTITY} - $<TARGET_FILE:debugserver> - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin - ) -endif() diff --git a/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp b/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp index 982367092ede..1e833c4cb165 100644 --- a/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp +++ b/tools/debugserver/source/MacOSX/DarwinLog/DarwinLogCollector.cpp @@ -50,6 +50,7 @@ bool LookupSPICalls() { static bool s_has_spi; std::call_once(s_once_flag, [] { + dlopen ("/System/Library/PrivateFrameworks/LoggingSupport.framework/LoggingSupport", RTLD_NOW); s_os_activity_stream_for_pid = (os_activity_stream_for_pid_t)dlsym( RTLD_DEFAULT, "os_activity_stream_for_pid"); s_os_activity_stream_resume = (os_activity_stream_resume_t)dlsym( @@ -691,7 +692,7 @@ void DarwinLogCollector::CancelActivityStream() { DNBLogThreadedIf(LOG_DARWIN_LOG, "DarwinLogCollector::%s(): canceling " "activity stream %p", - __FUNCTION__, m_activity_stream); + __FUNCTION__, reinterpret_cast<void *>(m_activity_stream)); (*s_os_activity_stream_cancel)(m_activity_stream); m_activity_stream = nullptr; } diff --git a/tools/debugserver/source/MacOSX/HasAVX.h b/tools/debugserver/source/MacOSX/HasAVX.h deleted file mode 100644 index 43fbd5e514e2..000000000000 --- a/tools/debugserver/source/MacOSX/HasAVX.h +++ /dev/null @@ -1,27 +0,0 @@ -//===-- HasAVX.h ------------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef HasAVX_h -#define HasAVX_h - -#if defined(__i386__) || defined(__x86_64__) - -#ifdef __cplusplus -extern "C" { -#endif - -int HasAVX(); - -#ifdef __cplusplus -} -#endif - -#endif - -#endif diff --git a/tools/debugserver/source/MacOSX/HasAVX.s b/tools/debugserver/source/MacOSX/HasAVX.s deleted file mode 100644 index b66ccf14dbee..000000000000 --- a/tools/debugserver/source/MacOSX/HasAVX.s +++ /dev/null @@ -1,50 +0,0 @@ -//===-- HasAVX.s ---------------------------------------*- x86 Assembly -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#if defined (__i386__) || defined (__x86_64__) - -.globl _HasAVX - -_HasAVX: -#if defined (__x86_64__) - pushq %rbp - movq %rsp, %rbp - pushq %rbx -#else - pushl %ebp - movl %esp, %ebp - pushl %ebx -#endif - mov $1, %eax - cpuid // clobbers ebx - and $0x018000000, %ecx - cmp $0x018000000, %ecx - jne not_supported - mov $0, %ecx -.byte 0x0f, 0x01, 0xd0 // xgetbv, for those assemblers that don't know it - and $0x06, %eax - cmp $0x06, %eax - jne not_supported - mov $1, %eax - jmp done -not_supported: - mov $0, %eax -done: -#if defined (__x86_64__) - popq %rbx - movq %rbp, %rsp - popq %rbp -#else - popl %ebx - movl %ebp, %esp - popl %ebp -#endif - ret // return - -#endif diff --git a/tools/debugserver/source/MacOSX/MachProcess.mm b/tools/debugserver/source/MacOSX/MachProcess.mm index 720f6bc8899e..0daaca1db37e 100644 --- a/tools/debugserver/source/MacOSX/MachProcess.mm +++ b/tools/debugserver/source/MacOSX/MachProcess.mm @@ -1269,7 +1269,7 @@ bool MachProcess::Interrupt() { bool MachProcess::Signal(int signal, const struct timespec *timeout_abstime) { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::Signal (signal = %d, timeout = %p)", signal, - timeout_abstime); + reinterpret_cast<const void *>(timeout_abstime)); nub_state_t state = GetState(); if (::kill(ProcessID(), signal) == 0) { // If we were running and we have a timeout, wait for the signal to stop @@ -1277,20 +1277,21 @@ bool MachProcess::Signal(int signal, const struct timespec *timeout_abstime) { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::Signal (signal = %d, timeout " "= %p) waiting for signal to stop " "process...", - signal, timeout_abstime); + signal, reinterpret_cast<const void *>(timeout_abstime)); m_private_events.WaitForSetEvents(eEventProcessStoppedStateChanged, timeout_abstime); state = GetState(); DNBLogThreadedIf( LOG_PROCESS, "MachProcess::Signal (signal = %d, timeout = %p) state = %s", signal, - timeout_abstime, DNBStateAsString(state)); + reinterpret_cast<const void *>(timeout_abstime), + DNBStateAsString(state)); return !IsRunning(state); } DNBLogThreadedIf( LOG_PROCESS, "MachProcess::Signal (signal = %d, timeout = %p) not waiting...", - signal, timeout_abstime); + signal, reinterpret_cast<const void *>(timeout_abstime)); return true; } DNBError err(errno, DNBError::POSIX); @@ -1596,7 +1597,8 @@ DNBBreakpoint *MachProcess::CreateBreakpoint(nub_addr_t addr, nub_size_t length, if (EnableBreakpoint(addr)) { DNBLogThreadedIf(LOG_BREAKPOINTS, "MachProcess::CreateBreakpoint ( addr = " "0x%8.8llx, length = %llu) => %p", - (uint64_t)addr, (uint64_t)length, bp); + (uint64_t)addr, (uint64_t)length, + reinterpret_cast<void *>(bp)); return bp; } else if (bp->Release() == 0) { m_breakpoints.Remove(addr); @@ -1627,7 +1629,8 @@ DNBBreakpoint *MachProcess::CreateWatchpoint(nub_addr_t addr, nub_size_t length, if (EnableWatchpoint(addr)) { DNBLogThreadedIf(LOG_WATCHPOINTS, "MachProcess::CreateWatchpoint ( addr = " "0x%8.8llx, length = %llu) => %p", - (uint64_t)addr, (uint64_t)length, wp); + (uint64_t)addr, (uint64_t)length, + reinterpret_cast<void *>(wp)); return wp; } else { DNBLogThreadedIf(LOG_WATCHPOINTS, "MachProcess::CreateWatchpoint ( addr = " @@ -2156,7 +2159,7 @@ void MachProcess::AppendSTDOUT(char *s, size_t len) { size_t MachProcess::GetAvailableSTDOUT(char *buf, size_t buf_size) { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (&%p[%llu]) ...", __FUNCTION__, - buf, (uint64_t)buf_size); + reinterpret_cast<void *>(buf), (uint64_t)buf_size); PTHREAD_MUTEX_LOCKER(locker, m_stdio_mutex); size_t bytes_available = m_stdout_data.size(); if (bytes_available > 0) { @@ -2316,7 +2319,7 @@ void MachProcess::SignalAsyncProfileData(const char *info) { size_t MachProcess::GetAsyncProfileData(char *buf, size_t buf_size) { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (&%p[%llu]) ...", __FUNCTION__, - buf, (uint64_t)buf_size); + reinterpret_cast<void *>(buf), (uint64_t)buf_size); PTHREAD_MUTEX_LOCKER(locker, m_profile_data_mutex); if (m_profile_data.empty()) return 0; @@ -2839,9 +2842,12 @@ pid_t MachProcess::LaunchForDebug( // Clear out and clean up from any current state Clear(); - DNBLogThreadedIf(LOG_PROCESS, "%s( path = '%s', argv = %p, envp = %p, " - "launch_flavor = %u, disable_aslr = %d )", - __FUNCTION__, path, argv, envp, launch_flavor, disable_aslr); + DNBLogThreadedIf(LOG_PROCESS, + "%s( path = '%s', argv = %p, envp = %p, " + "launch_flavor = %u, disable_aslr = %d )", + __FUNCTION__, path, reinterpret_cast<const void *>(argv), + reinterpret_cast<const void *>(envp), launch_flavor, + disable_aslr); // Fork a child process for debugging SetState(eStateLaunching); @@ -2984,7 +2990,8 @@ pid_t MachProcess::PosixSpawnChildForPTraceDebugging( DNBLogThreadedIf(LOG_PROCESS, "%s ( path='%s', argv=%p, envp=%p, " "working_dir=%s, stdin=%s, stdout=%s " "stderr=%s, no-stdio=%i)", - __FUNCTION__, path, argv, envp, working_directory, + __FUNCTION__, path, reinterpret_cast<const void *>(argv), + reinterpret_cast<const void *>(envp), working_directory, stdin_path, stdout_path, stderr_path, no_stdio); err.SetError(::posix_spawnattr_init(&attr), DNBError::POSIX); diff --git a/tools/debugserver/source/MacOSX/MachThread.cpp b/tools/debugserver/source/MacOSX/MachThread.cpp index 36aa8c04bf2a..5686e42e4a49 100644 --- a/tools/debugserver/source/MacOSX/MachThread.cpp +++ b/tools/debugserver/source/MacOSX/MachThread.cpp @@ -50,7 +50,7 @@ MachThread::MachThread(MachProcess *process, bool is_64_bit, DNBLogThreadedIf(LOG_THREAD | LOG_VERBOSE, "MachThread::MachThread ( process = %p, tid = 0x%8.8" PRIx64 ", seq_id = %u )", - &m_process, m_unique_id, m_seq_id); + reinterpret_cast<void *>(&m_process), m_unique_id, m_seq_id); } MachThread::~MachThread() { diff --git a/tools/debugserver/source/MacOSX/OsLogger.cpp b/tools/debugserver/source/MacOSX/OsLogger.cpp index efecea30212f..6cc04a8a7c83 100644 --- a/tools/debugserver/source/MacOSX/OsLogger.cpp +++ b/tools/debugserver/source/MacOSX/OsLogger.cpp @@ -8,8 +8,9 @@ //===----------------------------------------------------------------------===// #include "OsLogger.h" +#include <Availability.h> -#if LLDB_USE_OS_LOG +#if (LLDB_USE_OS_LOG) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101200) #include <os/log.h> @@ -64,3 +65,4 @@ DNBCallbackLog OsLogger::GetLogFunction() { DNBCallbackLog OsLogger::GetLogFunction() { return nullptr; } #endif + diff --git a/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp b/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp index 0974b168326d..6cc5ae6c36c4 100644 --- a/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp +++ b/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp @@ -339,60 +339,61 @@ kern_return_t DNBArchImplI386::GetGPRState(bool force) { kern_return_t DNBArchImplI386::GetFPUState(bool force) { if (force || m_state.GetError(e_regSetFPU, Read)) { if (DEBUG_FPU_REGS) { - if (CPUHasAVX() || FORCE_AVX_REGS) { - m_state.context.fpu.avx.__fpu_reserved[0] = -1; - m_state.context.fpu.avx.__fpu_reserved[1] = -1; - *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fcw) = 0x1234; - *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fsw) = 0x5678; - m_state.context.fpu.avx.__fpu_ftw = 1; - m_state.context.fpu.avx.__fpu_rsrv1 = UINT8_MAX; - m_state.context.fpu.avx.__fpu_fop = 2; - m_state.context.fpu.avx.__fpu_ip = 3; - m_state.context.fpu.avx.__fpu_cs = 4; - m_state.context.fpu.avx.__fpu_rsrv2 = 5; - m_state.context.fpu.avx.__fpu_dp = 6; - m_state.context.fpu.avx.__fpu_ds = 7; - m_state.context.fpu.avx.__fpu_rsrv3 = UINT16_MAX; - m_state.context.fpu.avx.__fpu_mxcsr = 8; - m_state.context.fpu.avx.__fpu_mxcsrmask = 9; - int i; - for (i = 0; i < 16; ++i) { - if (i < 10) { - m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = 'a'; - m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = 'b'; - m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = 'c'; - m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = 'd'; - m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = 'e'; - m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = 'f'; - m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = 'g'; - m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = 'h'; - } else { - m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN; - } - m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg[i] = '0'; - m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg[i] = '1'; - m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg[i] = '2'; - m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg[i] = '3'; - m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg[i] = '4'; - m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg[i] = '5'; - m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg[i] = '6'; - m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg[i] = '7'; + m_state.context.fpu.no_avx.__fpu_reserved[0] = -1; + m_state.context.fpu.no_avx.__fpu_reserved[1] = -1; + *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fcw) = 0x1234; + *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fsw) = 0x5678; + m_state.context.fpu.no_avx.__fpu_ftw = 1; + m_state.context.fpu.no_avx.__fpu_rsrv1 = UINT8_MAX; + m_state.context.fpu.no_avx.__fpu_fop = 2; + m_state.context.fpu.no_avx.__fpu_ip = 3; + m_state.context.fpu.no_avx.__fpu_cs = 4; + m_state.context.fpu.no_avx.__fpu_rsrv2 = 5; + m_state.context.fpu.no_avx.__fpu_dp = 6; + m_state.context.fpu.no_avx.__fpu_ds = 7; + m_state.context.fpu.no_avx.__fpu_rsrv3 = UINT16_MAX; + m_state.context.fpu.no_avx.__fpu_mxcsr = 8; + m_state.context.fpu.no_avx.__fpu_mxcsrmask = 9; + for (int i = 0; i < 16; ++i) { + if (i < 10) { + m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = 'a'; + m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = 'b'; + m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = 'c'; + m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = 'd'; + m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = 'e'; + m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = 'f'; + m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = 'g'; + m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = 'h'; + } else { + m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN; } - for (i = 0; i < sizeof(m_state.context.fpu.avx.__fpu_rsrv4); ++i) - m_state.context.fpu.avx.__fpu_rsrv4[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_reserved1 = -1; - for (i = 0; i < sizeof(m_state.context.fpu.avx.__avx_reserved1); ++i) + + m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg[i] = '0'; + m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg[i] = '1'; + m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg[i] = '2'; + m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg[i] = '3'; + m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg[i] = '4'; + m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg[i] = '5'; + m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg[i] = '6'; + m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg[i] = '7'; + } + for (int i = 0; i < sizeof(m_state.context.fpu.no_avx.__fpu_rsrv4); ++i) + m_state.context.fpu.no_avx.__fpu_rsrv4[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_reserved1 = -1; + + if (CPUHasAVX() || FORCE_AVX_REGS) { + for (int i = 0; i < sizeof(m_state.context.fpu.avx.__avx_reserved1); ++i) m_state.context.fpu.avx.__avx_reserved1[i] = INT8_MIN; - for (i = 0; i < 16; ++i) { + for (int i = 0; i < 16; ++i) { m_state.context.fpu.avx.__fpu_ymmh0.__xmm_reg[i] = '0'; m_state.context.fpu.avx.__fpu_ymmh1.__xmm_reg[i] = '1'; m_state.context.fpu.avx.__fpu_ymmh2.__xmm_reg[i] = '2'; @@ -402,83 +403,24 @@ kern_return_t DNBArchImplI386::GetFPUState(bool force) { m_state.context.fpu.avx.__fpu_ymmh6.__xmm_reg[i] = '6'; m_state.context.fpu.avx.__fpu_ymmh7.__xmm_reg[i] = '7'; } - } else { - m_state.context.fpu.no_avx.__fpu_reserved[0] = -1; - m_state.context.fpu.no_avx.__fpu_reserved[1] = -1; - *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fcw) = 0x1234; - *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fsw) = 0x5678; - m_state.context.fpu.no_avx.__fpu_ftw = 1; - m_state.context.fpu.no_avx.__fpu_rsrv1 = UINT8_MAX; - m_state.context.fpu.no_avx.__fpu_fop = 2; - m_state.context.fpu.no_avx.__fpu_ip = 3; - m_state.context.fpu.no_avx.__fpu_cs = 4; - m_state.context.fpu.no_avx.__fpu_rsrv2 = 5; - m_state.context.fpu.no_avx.__fpu_dp = 6; - m_state.context.fpu.no_avx.__fpu_ds = 7; - m_state.context.fpu.no_avx.__fpu_rsrv3 = UINT16_MAX; - m_state.context.fpu.no_avx.__fpu_mxcsr = 8; - m_state.context.fpu.no_avx.__fpu_mxcsrmask = 9; - int i; - for (i = 0; i < 16; ++i) { - if (i < 10) { - m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = 'a'; - m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = 'b'; - m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = 'c'; - m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = 'd'; - m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = 'e'; - m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = 'f'; - m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = 'g'; - m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = 'h'; - } else { - m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN; - } - - m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg[i] = '0'; - m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg[i] = '1'; - m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg[i] = '2'; - m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg[i] = '3'; - m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg[i] = '4'; - m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg[i] = '5'; - m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg[i] = '6'; - m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg[i] = '7'; - } - for (i = 0; i < sizeof(m_state.context.fpu.avx.__fpu_rsrv4); ++i) - m_state.context.fpu.no_avx.__fpu_rsrv4[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_reserved1 = -1; } m_state.SetError(e_regSetFPU, Read, 0); } else { + mach_msg_type_number_t count = e_regSetWordSizeFPU; + int flavor = __i386_FLOAT_STATE; + if (CPUHasAVX() || FORCE_AVX_REGS) { - mach_msg_type_number_t count = e_regSetWordSizeAVX; - m_state.SetError(e_regSetFPU, Read, - ::thread_get_state( - m_thread->MachPortNumber(), __i386_AVX_STATE, - (thread_state_t)&m_state.context.fpu.avx, &count)); - DNBLogThreadedIf(LOG_THREAD, "::thread_get_state (0x%4.4x, %u, &avx, " - "%u (%u passed in)) => 0x%8.8x", - m_thread->MachPortNumber(), __i386_AVX_STATE, count, - e_regSetWordSizeAVX, - m_state.GetError(e_regSetFPU, Read)); - } else { - mach_msg_type_number_t count = e_regSetWordSizeFPU; - m_state.SetError( - e_regSetFPU, Read, - ::thread_get_state(m_thread->MachPortNumber(), __i386_FLOAT_STATE, - (thread_state_t)&m_state.context.fpu.no_avx, - &count)); - DNBLogThreadedIf(LOG_THREAD, "::thread_get_state (0x%4.4x, %u, &fpu, " - "%u (%u passed in) => 0x%8.8x", - m_thread->MachPortNumber(), __i386_FLOAT_STATE, count, - e_regSetWordSizeFPU, - m_state.GetError(e_regSetFPU, Read)); + count = e_regSetWordSizeAVX; + flavor = __i386_AVX_STATE; } + m_state.SetError(e_regSetFPU, Read, + ::thread_get_state(m_thread->MachPortNumber(), flavor, + (thread_state_t)&m_state.context.fpu, + &count)); + DNBLogThreadedIf(LOG_THREAD, + "::thread_get_state (0x%4.4x, %u, &fpu, %u => 0x%8.8x", + m_thread->MachPortNumber(), flavor, (uint32_t)count, + m_state.GetError(e_regSetFPU, Read)); } } return m_state.GetError(e_regSetFPU, Read); @@ -1460,239 +1402,138 @@ bool DNBArchImplI386::GetRegisterValue(uint32_t set, uint32_t reg, break; case e_regSetFPU: - if (CPUHasAVX() || FORCE_AVX_REGS) { - switch (reg) { - case fpu_fcw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw)); - return true; - case fpu_fsw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw)); - return true; - case fpu_ftw: - value->value.uint8 = m_state.context.fpu.avx.__fpu_ftw; - return true; - case fpu_fop: - value->value.uint16 = m_state.context.fpu.avx.__fpu_fop; - return true; - case fpu_ip: - value->value.uint32 = m_state.context.fpu.avx.__fpu_ip; - return true; - case fpu_cs: - value->value.uint16 = m_state.context.fpu.avx.__fpu_cs; - return true; - case fpu_dp: - value->value.uint32 = m_state.context.fpu.avx.__fpu_dp; - return true; - case fpu_ds: - value->value.uint16 = m_state.context.fpu.avx.__fpu_ds; - return true; - case fpu_mxcsr: - value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsr; - return true; - case fpu_mxcsrmask: - value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsrmask; - return true; - - case fpu_stmm0: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg, 10); - return true; - case fpu_stmm1: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg, 10); - return true; - case fpu_stmm2: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg, 10); - return true; - case fpu_stmm3: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg, 10); - return true; - case fpu_stmm4: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg, 10); - return true; - case fpu_stmm5: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg, 10); - return true; - case fpu_stmm6: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg, 10); - return true; - case fpu_stmm7: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg, 10); - return true; - - case fpu_xmm0: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg, 16); - return true; - case fpu_xmm1: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg, 16); - return true; - case fpu_xmm2: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg, 16); - return true; - case fpu_xmm3: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg, 16); - return true; - case fpu_xmm4: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg, 16); - return true; - case fpu_xmm5: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg, 16); - return true; - case fpu_xmm6: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg, 16); - return true; - case fpu_xmm7: - memcpy(&value->value.uint8, - m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg, 16); - return true; + if (reg > fpu_xmm7 && !(CPUHasAVX() || FORCE_AVX_REGS)) + return false; + switch (reg) { + case fpu_fcw: + value->value.uint16 = + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)); + return true; + case fpu_fsw: + value->value.uint16 = + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)); + return true; + case fpu_ftw: + value->value.uint8 = m_state.context.fpu.no_avx.__fpu_ftw; + return true; + case fpu_fop: + value->value.uint16 = m_state.context.fpu.no_avx.__fpu_fop; + return true; + case fpu_ip: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_ip; + return true; + case fpu_cs: + value->value.uint16 = m_state.context.fpu.no_avx.__fpu_cs; + return true; + case fpu_dp: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_dp; + return true; + case fpu_ds: + value->value.uint16 = m_state.context.fpu.no_avx.__fpu_ds; + return true; + case fpu_mxcsr: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsr; + return true; + case fpu_mxcsrmask: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsrmask; + return true; + + case fpu_stmm0: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg, 10); + return true; + case fpu_stmm1: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg, 10); + return true; + case fpu_stmm2: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg, 10); + return true; + case fpu_stmm3: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg, 10); + return true; + case fpu_stmm4: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg, 10); + return true; + case fpu_stmm5: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg, 10); + return true; + case fpu_stmm6: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg, 10); + return true; + case fpu_stmm7: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg, 10); + return true; + + case fpu_xmm0: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg, 16); + return true; + case fpu_xmm1: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg, 16); + return true; + case fpu_xmm2: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg, 16); + return true; + case fpu_xmm3: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg, 16); + return true; + case fpu_xmm4: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg, 16); + return true; + case fpu_xmm5: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg, 16); + return true; + case fpu_xmm6: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg, 16); + return true; + case fpu_xmm7: + memcpy(&value->value.uint8, + m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg, 16); + return true; #define MEMCPY_YMM(n) \ memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm##n.__xmm_reg, \ 16); \ memcpy((&value->value.uint8) + 16, \ m_state.context.fpu.avx.__fpu_ymmh##n.__xmm_reg, 16); - case fpu_ymm0: - MEMCPY_YMM(0); - return true; - case fpu_ymm1: - MEMCPY_YMM(1); - return true; - case fpu_ymm2: - MEMCPY_YMM(2); - return true; - case fpu_ymm3: - MEMCPY_YMM(3); - return true; - case fpu_ymm4: - MEMCPY_YMM(4); - return true; - case fpu_ymm5: - MEMCPY_YMM(5); - return true; - case fpu_ymm6: - MEMCPY_YMM(6); - return true; - case fpu_ymm7: - MEMCPY_YMM(7); - return true; + case fpu_ymm0: + MEMCPY_YMM(0); + return true; + case fpu_ymm1: + MEMCPY_YMM(1); + return true; + case fpu_ymm2: + MEMCPY_YMM(2); + return true; + case fpu_ymm3: + MEMCPY_YMM(3); + return true; + case fpu_ymm4: + MEMCPY_YMM(4); + return true; + case fpu_ymm5: + MEMCPY_YMM(5); + return true; + case fpu_ymm6: + MEMCPY_YMM(6); + return true; + case fpu_ymm7: + MEMCPY_YMM(7); + return true; #undef MEMCPY_YMM - } - } else { - switch (reg) { - case fpu_fcw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)); - return true; - case fpu_fsw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)); - return true; - case fpu_ftw: - value->value.uint8 = m_state.context.fpu.no_avx.__fpu_ftw; - return true; - case fpu_fop: - value->value.uint16 = m_state.context.fpu.no_avx.__fpu_fop; - return true; - case fpu_ip: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_ip; - return true; - case fpu_cs: - value->value.uint16 = m_state.context.fpu.no_avx.__fpu_cs; - return true; - case fpu_dp: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_dp; - return true; - case fpu_ds: - value->value.uint16 = m_state.context.fpu.no_avx.__fpu_ds; - return true; - case fpu_mxcsr: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsr; - return true; - case fpu_mxcsrmask: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsrmask; - return true; - - case fpu_stmm0: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg, 10); - return true; - case fpu_stmm1: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg, 10); - return true; - case fpu_stmm2: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg, 10); - return true; - case fpu_stmm3: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg, 10); - return true; - case fpu_stmm4: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg, 10); - return true; - case fpu_stmm5: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg, 10); - return true; - case fpu_stmm6: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg, 10); - return true; - case fpu_stmm7: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg, 10); - return true; - - case fpu_xmm0: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg, 16); - return true; - case fpu_xmm1: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg, 16); - return true; - case fpu_xmm2: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg, 16); - return true; - case fpu_xmm3: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg, 16); - return true; - case fpu_xmm4: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg, 16); - return true; - case fpu_xmm5: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg, 16); - return true; - case fpu_xmm6: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg, 16); - return true; - case fpu_xmm7: - memcpy(&value->value.uint8, - m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg, 16); - return true; - } } break; @@ -1752,291 +1593,164 @@ bool DNBArchImplI386::SetRegisterValue(uint32_t set, uint32_t reg, break; case e_regSetFPU: - if (CPUHasAVX() || FORCE_AVX_REGS) { - switch (reg) { - case fpu_fcw: - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw)) = - value->value.uint16; - success = true; - break; - case fpu_fsw: - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw)) = - value->value.uint16; - success = true; - break; - case fpu_ftw: - m_state.context.fpu.avx.__fpu_ftw = value->value.uint8; - success = true; - break; - case fpu_fop: - m_state.context.fpu.avx.__fpu_fop = value->value.uint16; - success = true; - break; - case fpu_ip: - m_state.context.fpu.avx.__fpu_ip = value->value.uint32; - success = true; - break; - case fpu_cs: - m_state.context.fpu.avx.__fpu_cs = value->value.uint16; - success = true; - break; - case fpu_dp: - m_state.context.fpu.avx.__fpu_dp = value->value.uint32; - success = true; - break; - case fpu_ds: - m_state.context.fpu.avx.__fpu_ds = value->value.uint16; - success = true; - break; - case fpu_mxcsr: - m_state.context.fpu.avx.__fpu_mxcsr = value->value.uint32; - success = true; - break; - case fpu_mxcsrmask: - m_state.context.fpu.avx.__fpu_mxcsrmask = value->value.uint32; - success = true; - break; - - case fpu_stmm0: - memcpy(m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm1: - memcpy(m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm2: - memcpy(m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm3: - memcpy(m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm4: - memcpy(m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm5: - memcpy(m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm6: - memcpy(m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm7: - memcpy(m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - - case fpu_xmm0: - memcpy(m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm1: - memcpy(m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm2: - memcpy(m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm3: - memcpy(m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm4: - memcpy(m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm5: - memcpy(m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm6: - memcpy(m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm7: - memcpy(m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; + if (reg > fpu_xmm7 && !(CPUHasAVX() || FORCE_AVX_REGS)) + return false; + switch (reg) { + case fpu_fcw: + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)) = + value->value.uint16; + success = true; + break; + case fpu_fsw: + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)) = + value->value.uint16; + success = true; + break; + case fpu_ftw: + m_state.context.fpu.no_avx.__fpu_ftw = value->value.uint8; + success = true; + break; + case fpu_fop: + m_state.context.fpu.no_avx.__fpu_fop = value->value.uint16; + success = true; + break; + case fpu_ip: + m_state.context.fpu.no_avx.__fpu_ip = value->value.uint32; + success = true; + break; + case fpu_cs: + m_state.context.fpu.no_avx.__fpu_cs = value->value.uint16; + success = true; + break; + case fpu_dp: + m_state.context.fpu.no_avx.__fpu_dp = value->value.uint32; + success = true; + break; + case fpu_ds: + m_state.context.fpu.no_avx.__fpu_ds = value->value.uint16; + success = true; + break; + case fpu_mxcsr: + m_state.context.fpu.no_avx.__fpu_mxcsr = value->value.uint32; + success = true; + break; + case fpu_mxcsrmask: + m_state.context.fpu.no_avx.__fpu_mxcsrmask = value->value.uint32; + success = true; + break; + + case fpu_stmm0: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm1: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm2: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm3: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm4: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm5: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm6: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + case fpu_stmm7: + memcpy(m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg, + &value->value.uint8, 10); + success = true; + break; + + case fpu_xmm0: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm1: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm2: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm3: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm4: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm5: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm6: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; + case fpu_xmm7: + memcpy(m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg, + &value->value.uint8, 16); + success = true; + break; #define MEMCPY_YMM(n) \ memcpy(m_state.context.fpu.avx.__fpu_xmm##n.__xmm_reg, &value->value.uint8, \ 16); \ memcpy(m_state.context.fpu.avx.__fpu_ymmh##n.__xmm_reg, \ (&value->value.uint8) + 16, 16); - case fpu_ymm0: - MEMCPY_YMM(0); - return true; - case fpu_ymm1: - MEMCPY_YMM(1); - return true; - case fpu_ymm2: - MEMCPY_YMM(2); - return true; - case fpu_ymm3: - MEMCPY_YMM(3); - return true; - case fpu_ymm4: - MEMCPY_YMM(4); - return true; - case fpu_ymm5: - MEMCPY_YMM(5); - return true; - case fpu_ymm6: - MEMCPY_YMM(6); - return true; - case fpu_ymm7: - MEMCPY_YMM(7); - return true; + case fpu_ymm0: + MEMCPY_YMM(0); + return true; + case fpu_ymm1: + MEMCPY_YMM(1); + return true; + case fpu_ymm2: + MEMCPY_YMM(2); + return true; + case fpu_ymm3: + MEMCPY_YMM(3); + return true; + case fpu_ymm4: + MEMCPY_YMM(4); + return true; + case fpu_ymm5: + MEMCPY_YMM(5); + return true; + case fpu_ymm6: + MEMCPY_YMM(6); + return true; + case fpu_ymm7: + MEMCPY_YMM(7); + return true; #undef MEMCPY_YMM - } - } else { - switch (reg) { - case fpu_fcw: - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)) = - value->value.uint16; - success = true; - break; - case fpu_fsw: - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)) = - value->value.uint16; - success = true; - break; - case fpu_ftw: - m_state.context.fpu.no_avx.__fpu_ftw = value->value.uint8; - success = true; - break; - case fpu_fop: - m_state.context.fpu.no_avx.__fpu_fop = value->value.uint16; - success = true; - break; - case fpu_ip: - m_state.context.fpu.no_avx.__fpu_ip = value->value.uint32; - success = true; - break; - case fpu_cs: - m_state.context.fpu.no_avx.__fpu_cs = value->value.uint16; - success = true; - break; - case fpu_dp: - m_state.context.fpu.no_avx.__fpu_dp = value->value.uint32; - success = true; - break; - case fpu_ds: - m_state.context.fpu.no_avx.__fpu_ds = value->value.uint16; - success = true; - break; - case fpu_mxcsr: - m_state.context.fpu.no_avx.__fpu_mxcsr = value->value.uint32; - success = true; - break; - case fpu_mxcsrmask: - m_state.context.fpu.no_avx.__fpu_mxcsrmask = value->value.uint32; - success = true; - break; - - case fpu_stmm0: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm1: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm2: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm3: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm4: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm5: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm6: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - case fpu_stmm7: - memcpy(m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg, - &value->value.uint8, 10); - success = true; - break; - - case fpu_xmm0: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm1: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm2: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm3: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm4: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm5: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm6: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - case fpu_xmm7: - memcpy(m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg, - &value->value.uint8, 16); - success = true; - break; - } } break; @@ -2113,24 +1827,24 @@ nub_size_t DNBArchImplI386::GetRegisterContext(void *buf, nub_size_t buf_len) { memcpy(p, &m_state.context.gpr, sizeof(GPR)); p += sizeof(GPR); - if (CPUHasAVX() || FORCE_AVX_REGS) { - // Walk around the gaps in the FPU regs - memcpy(p, &m_state.context.fpu.avx.__fpu_fcw, 5); - p += 5; - memcpy(p, &m_state.context.fpu.avx.__fpu_fop, 8); - p += 8; - memcpy(p, &m_state.context.fpu.avx.__fpu_dp, 6); - p += 6; - memcpy(p, &m_state.context.fpu.avx.__fpu_mxcsr, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(p, &m_state.context.fpu.avx.__fpu_stmm0 + i, 10); - p += 10; - } + // Walk around the gaps in the FPU regs + memcpy(p, &m_state.context.fpu.no_avx.__fpu_fcw, 5); + p += 5; + memcpy(p, &m_state.context.fpu.no_avx.__fpu_fop, 8); + p += 8; + memcpy(p, &m_state.context.fpu.no_avx.__fpu_dp, 6); + p += 6; + memcpy(p, &m_state.context.fpu.no_avx.__fpu_mxcsr, 8); + p += 8; + + // Work around the padding between the stmm registers as they are 16 + // byte structs with 10 bytes of the value in each + for (size_t i = 0; i < 8; ++i) { + memcpy(p, &m_state.context.fpu.no_avx.__fpu_stmm0 + i, 10); + p += 10; + } + if (CPUHasAVX() || FORCE_AVX_REGS) { // Interleave the XMM and YMMH registers to make the YMM registers for (size_t i = 0; i < 8; ++i) { memcpy(p, &m_state.context.fpu.avx.__fpu_xmm0 + i, 16); @@ -2139,23 +1853,6 @@ nub_size_t DNBArchImplI386::GetRegisterContext(void *buf, nub_size_t buf_len) { p += 16; } } else { - // Walk around the gaps in the FPU regs - memcpy(p, &m_state.context.fpu.no_avx.__fpu_fcw, 5); - p += 5; - memcpy(p, &m_state.context.fpu.no_avx.__fpu_fop, 8); - p += 8; - memcpy(p, &m_state.context.fpu.no_avx.__fpu_dp, 6); - p += 6; - memcpy(p, &m_state.context.fpu.no_avx.__fpu_mxcsr, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(p, &m_state.context.fpu.no_avx.__fpu_stmm0 + i, 10); - p += 10; - } - // Copy the XMM registers in a single block memcpy(p, &m_state.context.fpu.no_avx.__fpu_xmm0, 8 * 16); p += 8 * 16; @@ -2194,24 +1891,24 @@ nub_size_t DNBArchImplI386::SetRegisterContext(const void *buf, memcpy(&m_state.context.gpr, p, sizeof(GPR)); p += sizeof(GPR); - if (CPUHasAVX() || FORCE_AVX_REGS) { - // Walk around the gaps in the FPU regs - memcpy(&m_state.context.fpu.avx.__fpu_fcw, p, 5); - p += 5; - memcpy(&m_state.context.fpu.avx.__fpu_fop, p, 8); - p += 8; - memcpy(&m_state.context.fpu.avx.__fpu_dp, p, 6); - p += 6; - memcpy(&m_state.context.fpu.avx.__fpu_mxcsr, p, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(&m_state.context.fpu.avx.__fpu_stmm0 + i, p, 10); - p += 10; - } + // Copy fcw through mxcsrmask as there is no padding + memcpy(&m_state.context.fpu.no_avx.__fpu_fcw, p, 5); + p += 5; + memcpy(&m_state.context.fpu.no_avx.__fpu_fop, p, 8); + p += 8; + memcpy(&m_state.context.fpu.no_avx.__fpu_dp, p, 6); + p += 6; + memcpy(&m_state.context.fpu.no_avx.__fpu_mxcsr, p, 8); + p += 8; + + // Work around the padding between the stmm registers as they are 16 + // byte structs with 10 bytes of the value in each + for (size_t i = 0; i < 8; ++i) { + memcpy(&m_state.context.fpu.no_avx.__fpu_stmm0 + i, p, 10); + p += 10; + } + if (CPUHasAVX() || FORCE_AVX_REGS) { // Interleave the XMM and YMMH registers to make the YMM registers for (size_t i = 0; i < 8; ++i) { memcpy(&m_state.context.fpu.avx.__fpu_xmm0 + i, p, 16); @@ -2220,23 +1917,6 @@ nub_size_t DNBArchImplI386::SetRegisterContext(const void *buf, p += 16; } } else { - // Copy fcw through mxcsrmask as there is no padding - memcpy(&m_state.context.fpu.no_avx.__fpu_fcw, p, 5); - p += 5; - memcpy(&m_state.context.fpu.no_avx.__fpu_fop, p, 8); - p += 8; - memcpy(&m_state.context.fpu.no_avx.__fpu_dp, p, 6); - p += 6; - memcpy(&m_state.context.fpu.no_avx.__fpu_mxcsr, p, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(&m_state.context.fpu.no_avx.__fpu_stmm0 + i, p, 10); - p += 10; - } - // Copy the XMM registers in a single block memcpy(&m_state.context.fpu.no_avx.__fpu_xmm0, p, 8 * 16); p += 8 * 16; diff --git a/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h b/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h index 5b0426688187..2e9542b051c6 100644 --- a/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h +++ b/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h @@ -16,7 +16,6 @@ #if defined(__i386__) || defined(__x86_64__) -#include "../HasAVX.h" #include "DNBArch.h" #include "MachRegisterStatesI386.h" diff --git a/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp b/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp index b8d35fe2f7c9..416b21f29958 100644 --- a/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp +++ b/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp @@ -17,7 +17,6 @@ #include <sys/sysctl.h> #include <sys/types.h> -#include "../HasAVX.h" #include "DNBLog.h" #include "MacOSX/x86_64/DNBArchImplX86_64.h" #include "MachProcess.h" @@ -60,42 +59,64 @@ static bool ForceAVXRegs() { #define FORCE_AVX_REGS (0) #endif -extern "C" bool CPUHasAVX() { - enum AVXPresence { eAVXUnknown = -1, eAVXNotPresent = 0, eAVXPresent = 1 }; +bool DetectHardwareFeature(const char *feature) { + int answer = 0; + size_t answer_size = sizeof(answer); + int error = ::sysctlbyname(feature, &answer, &answer_size, NULL, 0); + return error == 0 && answer != 0; +} + +enum AVXPresence { eAVXUnknown = -1, eAVXNotPresent = 0, eAVXPresent = 1 }; + +bool LogAVXAndReturn(AVXPresence has_avx, int err, const char * os_ver) { + DNBLogThreadedIf(LOG_THREAD, + "CPUHasAVX(): g_has_avx = %i (err = %i, os_ver = %s)", + has_avx, err, os_ver); + return (has_avx == eAVXPresent); +} +extern "C" bool CPUHasAVX() { static AVXPresence g_has_avx = eAVXUnknown; - if (g_has_avx == eAVXUnknown) { - g_has_avx = eAVXNotPresent; - - // Only xnu-2020 or later has AVX support, any versions before - // this have a busted thread_get_state RPC where it would truncate - // the thread state buffer (<rdar://problem/10122874>). So we need to - // verify the kernel version number manually or disable AVX support. - int mib[2]; - char buffer[1024]; - size_t length = sizeof(buffer); - uint64_t xnu_version = 0; - mib[0] = CTL_KERN; - mib[1] = KERN_VERSION; - int err = ::sysctl(mib, 2, &buffer, &length, NULL, 0); - if (err == 0) { - const char *xnu = strstr(buffer, "xnu-"); - if (xnu) { - const char *xnu_version_cstr = xnu + 4; - xnu_version = strtoull(xnu_version_cstr, NULL, 0); - if (xnu_version >= 2020 && xnu_version != ULLONG_MAX) { - if (::HasAVX()) { - g_has_avx = eAVXPresent; - } - } - } - } - DNBLogThreadedIf(LOG_THREAD, "CPUHasAVX(): g_has_avx = %i (err = %i, errno " - "= %i, xnu_version = %llu)", - g_has_avx, err, errno, xnu_version); + if (g_has_avx != eAVXUnknown) + return LogAVXAndReturn(g_has_avx, 0, ""); + + g_has_avx = eAVXNotPresent; + + // OS X 10.7.3 and earlier have a bug in thread_get_state that truncated the + // size of the return. To work around this we have to disable AVX debugging + // on hosts prior to 10.7.3 (<rdar://problem/10122874>). + int mib[2]; + char buffer[1024]; + size_t length = sizeof(buffer); + mib[0] = CTL_KERN; + mib[1] = KERN_OSVERSION; + + // KERN_OSVERSION returns the build number which is a number signifying the + // major version, a capitol letter signifying the minor version, and numbers + // signifying the build (ex: on 10.12.3, the returned value is 16D32). + int err = ::sysctl(mib, 2, &buffer, &length, NULL, 0); + if (err != 0) + return LogAVXAndReturn(g_has_avx, err, ""); + + size_t first_letter = 0; + for (; first_letter < length; ++first_letter) { + // This is looking for the first uppercase letter + if (isupper(buffer[first_letter])) + break; } - - return (g_has_avx == eAVXPresent); + char letter = buffer[first_letter]; + buffer[first_letter] = '\0'; + auto major_ver = strtoull(buffer, NULL, 0); + buffer[first_letter] = letter; + + // In this check we're looking to see that our major and minor version numer + // was >= 11E, which is the 10.7.4 release. + if (major_ver < 11 || (major_ver == 11 && letter < 'E')) + return LogAVXAndReturn(g_has_avx, err, buffer); + if (DetectHardwareFeature("hw.optional.avx1_0")) + g_has_avx = eAVXPresent; + + return LogAVXAndReturn(g_has_avx, err, buffer); } uint64_t DNBArchImplX86_64::GetPC(uint64_t failValue) { @@ -238,61 +259,65 @@ kern_return_t DNBArchImplX86_64::GetGPRState(bool force) { kern_return_t DNBArchImplX86_64::GetFPUState(bool force) { if (force || m_state.GetError(e_regSetFPU, Read)) { if (DEBUG_FPU_REGS) { - if (CPUHasAVX() || FORCE_AVX_REGS) { - m_state.context.fpu.avx.__fpu_reserved[0] = -1; - m_state.context.fpu.avx.__fpu_reserved[1] = -1; - *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fcw) = 0x1234; - *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fsw) = 0x5678; - m_state.context.fpu.avx.__fpu_ftw = 1; - m_state.context.fpu.avx.__fpu_rsrv1 = UINT8_MAX; - m_state.context.fpu.avx.__fpu_fop = 2; - m_state.context.fpu.avx.__fpu_ip = 3; - m_state.context.fpu.avx.__fpu_cs = 4; - m_state.context.fpu.avx.__fpu_rsrv2 = UINT8_MAX; - m_state.context.fpu.avx.__fpu_dp = 5; - m_state.context.fpu.avx.__fpu_ds = 6; - m_state.context.fpu.avx.__fpu_rsrv3 = UINT16_MAX; - m_state.context.fpu.avx.__fpu_mxcsr = 8; - m_state.context.fpu.avx.__fpu_mxcsrmask = 9; - int i; - for (i = 0; i < 16; ++i) { - if (i < 10) { - m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = 'a'; - m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = 'b'; - m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = 'c'; - m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = 'd'; - m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = 'e'; - m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = 'f'; - m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = 'g'; - m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = 'h'; - } else { - m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN; - } - - m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg[i] = '0' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg[i] = '1' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg[i] = '2' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg[i] = '3' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg[i] = '4' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg[i] = '5' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg[i] = '6' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg[i] = '7' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm8.__xmm_reg[i] = '8' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm9.__xmm_reg[i] = '9' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm10.__xmm_reg[i] = 'A' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm11.__xmm_reg[i] = 'B' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm12.__xmm_reg[i] = 'C' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm13.__xmm_reg[i] = 'D' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm14.__xmm_reg[i] = 'E' + 2 * i; - m_state.context.fpu.avx.__fpu_xmm15.__xmm_reg[i] = 'F' + 2 * i; + m_state.context.fpu.no_avx.__fpu_reserved[0] = -1; + m_state.context.fpu.no_avx.__fpu_reserved[1] = -1; + *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fcw) = 0x1234; + *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fsw) = 0x5678; + m_state.context.fpu.no_avx.__fpu_ftw = 1; + m_state.context.fpu.no_avx.__fpu_rsrv1 = UINT8_MAX; + m_state.context.fpu.no_avx.__fpu_fop = 2; + m_state.context.fpu.no_avx.__fpu_ip = 3; + m_state.context.fpu.no_avx.__fpu_cs = 4; + m_state.context.fpu.no_avx.__fpu_rsrv2 = 5; + m_state.context.fpu.no_avx.__fpu_dp = 6; + m_state.context.fpu.no_avx.__fpu_ds = 7; + m_state.context.fpu.no_avx.__fpu_rsrv3 = UINT16_MAX; + m_state.context.fpu.no_avx.__fpu_mxcsr = 8; + m_state.context.fpu.no_avx.__fpu_mxcsrmask = 9; + for (int i = 0; i < 16; ++i) { + if (i < 10) { + m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = 'a'; + m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = 'b'; + m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = 'c'; + m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = 'd'; + m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = 'e'; + m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = 'f'; + m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = 'g'; + m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = 'h'; + } else { + m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN; + } + m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg[i] = '0'; + m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg[i] = '1'; + m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg[i] = '2'; + m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg[i] = '3'; + m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg[i] = '4'; + m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg[i] = '5'; + m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg[i] = '6'; + m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg[i] = '7'; + m_state.context.fpu.no_avx.__fpu_xmm8.__xmm_reg[i] = '8'; + m_state.context.fpu.no_avx.__fpu_xmm9.__xmm_reg[i] = '9'; + m_state.context.fpu.no_avx.__fpu_xmm10.__xmm_reg[i] = 'A'; + m_state.context.fpu.no_avx.__fpu_xmm11.__xmm_reg[i] = 'B'; + m_state.context.fpu.no_avx.__fpu_xmm12.__xmm_reg[i] = 'C'; + m_state.context.fpu.no_avx.__fpu_xmm13.__xmm_reg[i] = 'D'; + m_state.context.fpu.no_avx.__fpu_xmm14.__xmm_reg[i] = 'E'; + m_state.context.fpu.no_avx.__fpu_xmm15.__xmm_reg[i] = 'F'; + } + for (int i = 0; i < sizeof(m_state.context.fpu.no_avx.__fpu_rsrv4); ++i) + m_state.context.fpu.no_avx.__fpu_rsrv4[i] = INT8_MIN; + m_state.context.fpu.no_avx.__fpu_reserved1 = -1; + + if (CPUHasAVX() || FORCE_AVX_REGS) { + for (int i = 0; i < 16; ++i) { m_state.context.fpu.avx.__fpu_ymmh0.__xmm_reg[i] = '0' + i; m_state.context.fpu.avx.__fpu_ymmh1.__xmm_reg[i] = '1' + i; m_state.context.fpu.avx.__fpu_ymmh2.__xmm_reg[i] = '2' + i; @@ -310,97 +335,25 @@ kern_return_t DNBArchImplX86_64::GetFPUState(bool force) { m_state.context.fpu.avx.__fpu_ymmh14.__xmm_reg[i] = 'E' + i; m_state.context.fpu.avx.__fpu_ymmh15.__xmm_reg[i] = 'F' + i; } - for (i = 0; i < sizeof(m_state.context.fpu.avx.__fpu_rsrv4); ++i) - m_state.context.fpu.avx.__fpu_rsrv4[i] = INT8_MIN; - m_state.context.fpu.avx.__fpu_reserved1 = -1; - for (i = 0; i < sizeof(m_state.context.fpu.avx.__avx_reserved1); ++i) + for (int i = 0; i < sizeof(m_state.context.fpu.avx.__avx_reserved1); ++i) m_state.context.fpu.avx.__avx_reserved1[i] = INT8_MIN; - m_state.SetError(e_regSetFPU, Read, 0); - } else { - m_state.context.fpu.no_avx.__fpu_reserved[0] = -1; - m_state.context.fpu.no_avx.__fpu_reserved[1] = -1; - *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fcw) = 0x1234; - *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fsw) = 0x5678; - m_state.context.fpu.no_avx.__fpu_ftw = 1; - m_state.context.fpu.no_avx.__fpu_rsrv1 = UINT8_MAX; - m_state.context.fpu.no_avx.__fpu_fop = 2; - m_state.context.fpu.no_avx.__fpu_ip = 3; - m_state.context.fpu.no_avx.__fpu_cs = 4; - m_state.context.fpu.no_avx.__fpu_rsrv2 = 5; - m_state.context.fpu.no_avx.__fpu_dp = 6; - m_state.context.fpu.no_avx.__fpu_ds = 7; - m_state.context.fpu.no_avx.__fpu_rsrv3 = UINT16_MAX; - m_state.context.fpu.no_avx.__fpu_mxcsr = 8; - m_state.context.fpu.no_avx.__fpu_mxcsrmask = 9; - int i; - for (i = 0; i < 16; ++i) { - if (i < 10) { - m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = 'a'; - m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = 'b'; - m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = 'c'; - m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = 'd'; - m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = 'e'; - m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = 'f'; - m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = 'g'; - m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = 'h'; - } else { - m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN; - } - - m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg[i] = '0'; - m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg[i] = '1'; - m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg[i] = '2'; - m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg[i] = '3'; - m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg[i] = '4'; - m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg[i] = '5'; - m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg[i] = '6'; - m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg[i] = '7'; - m_state.context.fpu.no_avx.__fpu_xmm8.__xmm_reg[i] = '8'; - m_state.context.fpu.no_avx.__fpu_xmm9.__xmm_reg[i] = '9'; - m_state.context.fpu.no_avx.__fpu_xmm10.__xmm_reg[i] = 'A'; - m_state.context.fpu.no_avx.__fpu_xmm11.__xmm_reg[i] = 'B'; - m_state.context.fpu.no_avx.__fpu_xmm12.__xmm_reg[i] = 'C'; - m_state.context.fpu.no_avx.__fpu_xmm13.__xmm_reg[i] = 'D'; - m_state.context.fpu.no_avx.__fpu_xmm14.__xmm_reg[i] = 'E'; - m_state.context.fpu.no_avx.__fpu_xmm15.__xmm_reg[i] = 'F'; - } - for (i = 0; i < sizeof(m_state.context.fpu.no_avx.__fpu_rsrv4); ++i) - m_state.context.fpu.no_avx.__fpu_rsrv4[i] = INT8_MIN; - m_state.context.fpu.no_avx.__fpu_reserved1 = -1; - m_state.SetError(e_regSetFPU, Read, 0); } + m_state.SetError(e_regSetFPU, Read, 0); } else { + mach_msg_type_number_t count = e_regSetWordSizeFPU; + int flavor = __x86_64_FLOAT_STATE; if (CPUHasAVX() || FORCE_AVX_REGS) { - mach_msg_type_number_t count = e_regSetWordSizeAVX; - m_state.SetError(e_regSetFPU, Read, - ::thread_get_state( - m_thread->MachPortNumber(), __x86_64_AVX_STATE, - (thread_state_t)&m_state.context.fpu.avx, &count)); - DNBLogThreadedIf(LOG_THREAD, "::thread_get_state (0x%4.4x, %u, &avx, " - "%u (%u passed in) carp) => 0x%8.8x", - m_thread->MachPortNumber(), __x86_64_AVX_STATE, - (uint32_t)count, e_regSetWordSizeAVX, - m_state.GetError(e_regSetFPU, Read)); - } else { - mach_msg_type_number_t count = e_regSetWordSizeFPU; - m_state.SetError( - e_regSetFPU, Read, - ::thread_get_state(m_thread->MachPortNumber(), __x86_64_FLOAT_STATE, - (thread_state_t)&m_state.context.fpu.no_avx, - &count)); - DNBLogThreadedIf(LOG_THREAD, "::thread_get_state (0x%4.4x, %u, &fpu, " - "%u (%u passed in) => 0x%8.8x", - m_thread->MachPortNumber(), __x86_64_FLOAT_STATE, - (uint32_t)count, e_regSetWordSizeFPU, - m_state.GetError(e_regSetFPU, Read)); + count = e_regSetWordSizeAVX; + flavor = __x86_64_AVX_STATE; } + m_state.SetError(e_regSetFPU, Read, + ::thread_get_state(m_thread->MachPortNumber(), flavor, + (thread_state_t)&m_state.context.fpu, + &count)); + DNBLogThreadedIf(LOG_THREAD, + "::thread_get_state (0x%4.4x, %u, &fpu, %u => 0x%8.8x", + m_thread->MachPortNumber(), flavor, (uint32_t)count, + m_state.GetError(e_regSetFPU, Read)); } } return m_state.GetError(e_regSetFPU, Read); @@ -458,21 +411,17 @@ kern_return_t DNBArchImplX86_64::SetFPUState() { m_state.SetError(e_regSetFPU, Write, 0); return m_state.GetError(e_regSetFPU, Write); } else { + int flavor = __x86_64_FLOAT_STATE; + mach_msg_type_number_t count = e_regSetWordSizeFPU; if (CPUHasAVX() || FORCE_AVX_REGS) { - m_state.SetError( - e_regSetFPU, Write, - ::thread_set_state(m_thread->MachPortNumber(), __x86_64_AVX_STATE, - (thread_state_t)&m_state.context.fpu.avx, - e_regSetWordSizeAVX)); - return m_state.GetError(e_regSetFPU, Write); - } else { - m_state.SetError( - e_regSetFPU, Write, - ::thread_set_state(m_thread->MachPortNumber(), __x86_64_FLOAT_STATE, - (thread_state_t)&m_state.context.fpu.no_avx, - e_regSetWordSizeFPU)); - return m_state.GetError(e_regSetFPU, Write); + flavor = __x86_64_AVX_STATE; + count = e_regSetWordSizeAVX; } + m_state.SetError( + e_regSetFPU, Write, + ::thread_set_state(m_thread->MachPortNumber(), flavor, + (thread_state_t)&m_state.context.fpu, count)); + return m_state.GetError(e_regSetFPU, Write); } } @@ -1814,163 +1763,96 @@ bool DNBArchImplX86_64::GetRegisterValue(uint32_t set, uint32_t reg, break; case e_regSetFPU: - if (CPUHasAVX() || FORCE_AVX_REGS) { - switch (reg) { - case fpu_fcw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw)); - return true; - case fpu_fsw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw)); - return true; - case fpu_ftw: - value->value.uint8 = m_state.context.fpu.avx.__fpu_ftw; - return true; - case fpu_fop: - value->value.uint16 = m_state.context.fpu.avx.__fpu_fop; - return true; - case fpu_ip: - value->value.uint32 = m_state.context.fpu.avx.__fpu_ip; - return true; - case fpu_cs: - value->value.uint16 = m_state.context.fpu.avx.__fpu_cs; - return true; - case fpu_dp: - value->value.uint32 = m_state.context.fpu.avx.__fpu_dp; - return true; - case fpu_ds: - value->value.uint16 = m_state.context.fpu.avx.__fpu_ds; - return true; - case fpu_mxcsr: - value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsr; - return true; - case fpu_mxcsrmask: - value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsrmask; - return true; - - case fpu_stmm0: - case fpu_stmm1: - case fpu_stmm2: - case fpu_stmm3: - case fpu_stmm4: - case fpu_stmm5: - case fpu_stmm6: - case fpu_stmm7: - memcpy(&value->value.uint8, - &m_state.context.fpu.avx.__fpu_stmm0 + (reg - fpu_stmm0), 10); - return true; - - case fpu_xmm0: - case fpu_xmm1: - case fpu_xmm2: - case fpu_xmm3: - case fpu_xmm4: - case fpu_xmm5: - case fpu_xmm6: - case fpu_xmm7: - case fpu_xmm8: - case fpu_xmm9: - case fpu_xmm10: - case fpu_xmm11: - case fpu_xmm12: - case fpu_xmm13: - case fpu_xmm14: - case fpu_xmm15: - memcpy(&value->value.uint8, - &m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_xmm0), 16); - return true; - - case fpu_ymm0: - case fpu_ymm1: - case fpu_ymm2: - case fpu_ymm3: - case fpu_ymm4: - case fpu_ymm5: - case fpu_ymm6: - case fpu_ymm7: - case fpu_ymm8: - case fpu_ymm9: - case fpu_ymm10: - case fpu_ymm11: - case fpu_ymm12: - case fpu_ymm13: - case fpu_ymm14: - case fpu_ymm15: - memcpy(&value->value.uint8, - &m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_ymm0), 16); - memcpy((&value->value.uint8) + 16, - &m_state.context.fpu.avx.__fpu_ymmh0 + (reg - fpu_ymm0), 16); - return true; - } - } else { - switch (reg) { - case fpu_fcw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)); - return true; - case fpu_fsw: - value->value.uint16 = - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)); - return true; - case fpu_ftw: - value->value.uint8 = m_state.context.fpu.no_avx.__fpu_ftw; - return true; - case fpu_fop: - value->value.uint16 = m_state.context.fpu.no_avx.__fpu_fop; - return true; - case fpu_ip: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_ip; - return true; - case fpu_cs: - value->value.uint16 = m_state.context.fpu.no_avx.__fpu_cs; - return true; - case fpu_dp: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_dp; - return true; - case fpu_ds: - value->value.uint16 = m_state.context.fpu.no_avx.__fpu_ds; - return true; - case fpu_mxcsr: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsr; - return true; - case fpu_mxcsrmask: - value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsrmask; - return true; - - case fpu_stmm0: - case fpu_stmm1: - case fpu_stmm2: - case fpu_stmm3: - case fpu_stmm4: - case fpu_stmm5: - case fpu_stmm6: - case fpu_stmm7: - memcpy(&value->value.uint8, - &m_state.context.fpu.no_avx.__fpu_stmm0 + (reg - fpu_stmm0), - 10); - return true; - - case fpu_xmm0: - case fpu_xmm1: - case fpu_xmm2: - case fpu_xmm3: - case fpu_xmm4: - case fpu_xmm5: - case fpu_xmm6: - case fpu_xmm7: - case fpu_xmm8: - case fpu_xmm9: - case fpu_xmm10: - case fpu_xmm11: - case fpu_xmm12: - case fpu_xmm13: - case fpu_xmm14: - case fpu_xmm15: - memcpy(&value->value.uint8, - &m_state.context.fpu.no_avx.__fpu_xmm0 + (reg - fpu_xmm0), 16); - return true; - } + if (reg > fpu_xmm15 && !(CPUHasAVX() || FORCE_AVX_REGS)) + return false; + switch (reg) { + + case fpu_fcw: + value->value.uint16 = + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)); + return true; + case fpu_fsw: + value->value.uint16 = + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)); + return true; + case fpu_ftw: + value->value.uint8 = m_state.context.fpu.no_avx.__fpu_ftw; + return true; + case fpu_fop: + value->value.uint16 = m_state.context.fpu.no_avx.__fpu_fop; + return true; + case fpu_ip: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_ip; + return true; + case fpu_cs: + value->value.uint16 = m_state.context.fpu.no_avx.__fpu_cs; + return true; + case fpu_dp: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_dp; + return true; + case fpu_ds: + value->value.uint16 = m_state.context.fpu.no_avx.__fpu_ds; + return true; + case fpu_mxcsr: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsr; + return true; + case fpu_mxcsrmask: + value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsrmask; + return true; + + case fpu_stmm0: + case fpu_stmm1: + case fpu_stmm2: + case fpu_stmm3: + case fpu_stmm4: + case fpu_stmm5: + case fpu_stmm6: + case fpu_stmm7: + memcpy(&value->value.uint8, + &m_state.context.fpu.no_avx.__fpu_stmm0 + (reg - fpu_stmm0), 10); + return true; + + case fpu_xmm0: + case fpu_xmm1: + case fpu_xmm2: + case fpu_xmm3: + case fpu_xmm4: + case fpu_xmm5: + case fpu_xmm6: + case fpu_xmm7: + case fpu_xmm8: + case fpu_xmm9: + case fpu_xmm10: + case fpu_xmm11: + case fpu_xmm12: + case fpu_xmm13: + case fpu_xmm14: + case fpu_xmm15: + memcpy(&value->value.uint8, + &m_state.context.fpu.no_avx.__fpu_xmm0 + (reg - fpu_xmm0), 16); + return true; + + case fpu_ymm0: + case fpu_ymm1: + case fpu_ymm2: + case fpu_ymm3: + case fpu_ymm4: + case fpu_ymm5: + case fpu_ymm6: + case fpu_ymm7: + case fpu_ymm8: + case fpu_ymm9: + case fpu_ymm10: + case fpu_ymm11: + case fpu_ymm12: + case fpu_ymm13: + case fpu_ymm14: + case fpu_ymm15: + memcpy(&value->value.uint8, + &m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_ymm0), 16); + memcpy((&value->value.uint8) + 16, + &m_state.context.fpu.avx.__fpu_ymmh0 + (reg - fpu_ymm0), 16); + return true; } break; @@ -2035,188 +1917,108 @@ bool DNBArchImplX86_64::SetRegisterValue(uint32_t set, uint32_t reg, success = true; } break; - + if (reg > fpu_xmm15 && !(CPUHasAVX() || FORCE_AVX_REGS)) + return false; case e_regSetFPU: - if (CPUHasAVX() || FORCE_AVX_REGS) { - switch (reg) { - case fpu_fcw: - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw)) = - value->value.uint16; - success = true; - break; - case fpu_fsw: - *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw)) = - value->value.uint16; - success = true; - break; - case fpu_ftw: - m_state.context.fpu.avx.__fpu_ftw = value->value.uint8; - success = true; - break; - case fpu_fop: - m_state.context.fpu.avx.__fpu_fop = value->value.uint16; - success = true; - break; - case fpu_ip: - m_state.context.fpu.avx.__fpu_ip = value->value.uint32; - success = true; - break; - case fpu_cs: - m_state.context.fpu.avx.__fpu_cs = value->value.uint16; - success = true; - break; - case fpu_dp: - m_state.context.fpu.avx.__fpu_dp = value->value.uint32; - success = true; - break; - case fpu_ds: - m_state.context.fpu.avx.__fpu_ds = value->value.uint16; - success = true; - break; - case fpu_mxcsr: - m_state.context.fpu.avx.__fpu_mxcsr = value->value.uint32; - success = true; - break; - case fpu_mxcsrmask: - m_state.context.fpu.avx.__fpu_mxcsrmask = value->value.uint32; - success = true; - break; - - case fpu_stmm0: - case fpu_stmm1: - case fpu_stmm2: - case fpu_stmm3: - case fpu_stmm4: - case fpu_stmm5: - case fpu_stmm6: - case fpu_stmm7: - memcpy(&m_state.context.fpu.avx.__fpu_stmm0 + (reg - fpu_stmm0), - &value->value.uint8, 10); - success = true; - break; - - case fpu_xmm0: - case fpu_xmm1: - case fpu_xmm2: - case fpu_xmm3: - case fpu_xmm4: - case fpu_xmm5: - case fpu_xmm6: - case fpu_xmm7: - case fpu_xmm8: - case fpu_xmm9: - case fpu_xmm10: - case fpu_xmm11: - case fpu_xmm12: - case fpu_xmm13: - case fpu_xmm14: - case fpu_xmm15: - memcpy(&m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_xmm0), - &value->value.uint8, 16); - success = true; - break; - - case fpu_ymm0: - case fpu_ymm1: - case fpu_ymm2: - case fpu_ymm3: - case fpu_ymm4: - case fpu_ymm5: - case fpu_ymm6: - case fpu_ymm7: - case fpu_ymm8: - case fpu_ymm9: - case fpu_ymm10: - case fpu_ymm11: - case fpu_ymm12: - case fpu_ymm13: - case fpu_ymm14: - case fpu_ymm15: - memcpy(&m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_ymm0), - &value->value.uint8, 16); - memcpy(&m_state.context.fpu.avx.__fpu_ymmh0 + (reg - fpu_ymm0), - (&value->value.uint8) + 16, 16); - return true; - } - } else { - switch (reg) { - case fpu_fcw: - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)) = - value->value.uint16; - success = true; - break; - case fpu_fsw: - *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)) = - value->value.uint16; - success = true; - break; - case fpu_ftw: - m_state.context.fpu.no_avx.__fpu_ftw = value->value.uint8; - success = true; - break; - case fpu_fop: - m_state.context.fpu.no_avx.__fpu_fop = value->value.uint16; - success = true; - break; - case fpu_ip: - m_state.context.fpu.no_avx.__fpu_ip = value->value.uint32; - success = true; - break; - case fpu_cs: - m_state.context.fpu.no_avx.__fpu_cs = value->value.uint16; - success = true; - break; - case fpu_dp: - m_state.context.fpu.no_avx.__fpu_dp = value->value.uint32; - success = true; - break; - case fpu_ds: - m_state.context.fpu.no_avx.__fpu_ds = value->value.uint16; - success = true; - break; - case fpu_mxcsr: - m_state.context.fpu.no_avx.__fpu_mxcsr = value->value.uint32; - success = true; - break; - case fpu_mxcsrmask: - m_state.context.fpu.no_avx.__fpu_mxcsrmask = value->value.uint32; - success = true; - break; - - case fpu_stmm0: - case fpu_stmm1: - case fpu_stmm2: - case fpu_stmm3: - case fpu_stmm4: - case fpu_stmm5: - case fpu_stmm6: - case fpu_stmm7: - memcpy(&m_state.context.fpu.no_avx.__fpu_stmm0 + (reg - fpu_stmm0), - &value->value.uint8, 10); - success = true; - break; - - case fpu_xmm0: - case fpu_xmm1: - case fpu_xmm2: - case fpu_xmm3: - case fpu_xmm4: - case fpu_xmm5: - case fpu_xmm6: - case fpu_xmm7: - case fpu_xmm8: - case fpu_xmm9: - case fpu_xmm10: - case fpu_xmm11: - case fpu_xmm12: - case fpu_xmm13: - case fpu_xmm14: - case fpu_xmm15: - memcpy(&m_state.context.fpu.no_avx.__fpu_xmm0 + (reg - fpu_xmm0), - &value->value.uint8, 16); - success = true; - break; - } + switch (reg) { + case fpu_fcw: + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)) = + value->value.uint16; + success = true; + break; + case fpu_fsw: + *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)) = + value->value.uint16; + success = true; + break; + case fpu_ftw: + m_state.context.fpu.no_avx.__fpu_ftw = value->value.uint8; + success = true; + break; + case fpu_fop: + m_state.context.fpu.no_avx.__fpu_fop = value->value.uint16; + success = true; + break; + case fpu_ip: + m_state.context.fpu.no_avx.__fpu_ip = value->value.uint32; + success = true; + break; + case fpu_cs: + m_state.context.fpu.no_avx.__fpu_cs = value->value.uint16; + success = true; + break; + case fpu_dp: + m_state.context.fpu.no_avx.__fpu_dp = value->value.uint32; + success = true; + break; + case fpu_ds: + m_state.context.fpu.no_avx.__fpu_ds = value->value.uint16; + success = true; + break; + case fpu_mxcsr: + m_state.context.fpu.no_avx.__fpu_mxcsr = value->value.uint32; + success = true; + break; + case fpu_mxcsrmask: + m_state.context.fpu.no_avx.__fpu_mxcsrmask = value->value.uint32; + success = true; + break; + + case fpu_stmm0: + case fpu_stmm1: + case fpu_stmm2: + case fpu_stmm3: + case fpu_stmm4: + case fpu_stmm5: + case fpu_stmm6: + case fpu_stmm7: + memcpy(&m_state.context.fpu.no_avx.__fpu_stmm0 + (reg - fpu_stmm0), + &value->value.uint8, 10); + success = true; + break; + + case fpu_xmm0: + case fpu_xmm1: + case fpu_xmm2: + case fpu_xmm3: + case fpu_xmm4: + case fpu_xmm5: + case fpu_xmm6: + case fpu_xmm7: + case fpu_xmm8: + case fpu_xmm9: + case fpu_xmm10: + case fpu_xmm11: + case fpu_xmm12: + case fpu_xmm13: + case fpu_xmm14: + case fpu_xmm15: + memcpy(&m_state.context.fpu.no_avx.__fpu_xmm0 + (reg - fpu_xmm0), + &value->value.uint8, 16); + success = true; + break; + + case fpu_ymm0: + case fpu_ymm1: + case fpu_ymm2: + case fpu_ymm3: + case fpu_ymm4: + case fpu_ymm5: + case fpu_ymm6: + case fpu_ymm7: + case fpu_ymm8: + case fpu_ymm9: + case fpu_ymm10: + case fpu_ymm11: + case fpu_ymm12: + case fpu_ymm13: + case fpu_ymm14: + case fpu_ymm15: + memcpy(&m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_ymm0), + &value->value.uint8, 16); + memcpy(&m_state.context.fpu.avx.__fpu_ymmh0 + (reg - fpu_ymm0), + (&value->value.uint8) + 16, 16); + return true; } break; @@ -2302,24 +2104,24 @@ nub_size_t DNBArchImplX86_64::GetRegisterContext(void *buf, memcpy(p, &m_state.context.gpr, sizeof(GPR)); p += sizeof(GPR); - if (CPUHasAVX() || FORCE_AVX_REGS) { - // Walk around the gaps in the FPU regs - memcpy(p, &m_state.context.fpu.avx.__fpu_fcw, 5); - p += 5; - memcpy(p, &m_state.context.fpu.avx.__fpu_fop, 8); - p += 8; - memcpy(p, &m_state.context.fpu.avx.__fpu_dp, 6); - p += 6; - memcpy(p, &m_state.context.fpu.avx.__fpu_mxcsr, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(p, &m_state.context.fpu.avx.__fpu_stmm0 + i, 10); - p += 10; - } + // Walk around the gaps in the FPU regs + memcpy(p, &m_state.context.fpu.no_avx.__fpu_fcw, 5); + p += 5; + memcpy(p, &m_state.context.fpu.no_avx.__fpu_fop, 8); + p += 8; + memcpy(p, &m_state.context.fpu.no_avx.__fpu_dp, 6); + p += 6; + memcpy(p, &m_state.context.fpu.no_avx.__fpu_mxcsr, 8); + p += 8; + + // Work around the padding between the stmm registers as they are 16 + // byte structs with 10 bytes of the value in each + for (size_t i = 0; i < 8; ++i) { + memcpy(p, &m_state.context.fpu.no_avx.__fpu_stmm0 + i, 10); + p += 10; + } + if (CPUHasAVX() || FORCE_AVX_REGS) { // Interleave the XMM and YMMH registers to make the YMM registers for (size_t i = 0; i < 16; ++i) { memcpy(p, &m_state.context.fpu.avx.__fpu_xmm0 + i, 16); @@ -2328,23 +2130,6 @@ nub_size_t DNBArchImplX86_64::GetRegisterContext(void *buf, p += 16; } } else { - // Walk around the gaps in the FPU regs - memcpy(p, &m_state.context.fpu.no_avx.__fpu_fcw, 5); - p += 5; - memcpy(p, &m_state.context.fpu.no_avx.__fpu_fop, 8); - p += 8; - memcpy(p, &m_state.context.fpu.no_avx.__fpu_dp, 6); - p += 6; - memcpy(p, &m_state.context.fpu.no_avx.__fpu_mxcsr, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(p, &m_state.context.fpu.no_avx.__fpu_stmm0 + i, 10); - p += 10; - } - // Copy the XMM registers in a single block memcpy(p, &m_state.context.fpu.no_avx.__fpu_xmm0, 16 * 16); p += 16 * 16; @@ -2384,24 +2169,24 @@ nub_size_t DNBArchImplX86_64::SetRegisterContext(const void *buf, memcpy(&m_state.context.gpr, p, sizeof(GPR)); p += sizeof(GPR); - if (CPUHasAVX() || FORCE_AVX_REGS) { - // Walk around the gaps in the FPU regs - memcpy(&m_state.context.fpu.avx.__fpu_fcw, p, 5); - p += 5; - memcpy(&m_state.context.fpu.avx.__fpu_fop, p, 8); - p += 8; - memcpy(&m_state.context.fpu.avx.__fpu_dp, p, 6); - p += 6; - memcpy(&m_state.context.fpu.avx.__fpu_mxcsr, p, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(&m_state.context.fpu.avx.__fpu_stmm0 + i, p, 10); - p += 10; - } + // Copy fcw through mxcsrmask as there is no padding + memcpy(&m_state.context.fpu.no_avx.__fpu_fcw, p, 5); + p += 5; + memcpy(&m_state.context.fpu.no_avx.__fpu_fop, p, 8); + p += 8; + memcpy(&m_state.context.fpu.no_avx.__fpu_dp, p, 6); + p += 6; + memcpy(&m_state.context.fpu.no_avx.__fpu_mxcsr, p, 8); + p += 8; + + // Work around the padding between the stmm registers as they are 16 + // byte structs with 10 bytes of the value in each + for (size_t i = 0; i < 8; ++i) { + memcpy(&m_state.context.fpu.no_avx.__fpu_stmm0 + i, p, 10); + p += 10; + } + if (CPUHasAVX() || FORCE_AVX_REGS) { // Interleave the XMM and YMMH registers to make the YMM registers for (size_t i = 0; i < 16; ++i) { memcpy(&m_state.context.fpu.avx.__fpu_xmm0 + i, p, 16); @@ -2410,23 +2195,6 @@ nub_size_t DNBArchImplX86_64::SetRegisterContext(const void *buf, p += 16; } } else { - // Copy fcw through mxcsrmask as there is no padding - memcpy(&m_state.context.fpu.no_avx.__fpu_fcw, p, 5); - p += 5; - memcpy(&m_state.context.fpu.no_avx.__fpu_fop, p, 8); - p += 8; - memcpy(&m_state.context.fpu.no_avx.__fpu_dp, p, 6); - p += 6; - memcpy(&m_state.context.fpu.no_avx.__fpu_mxcsr, p, 8); - p += 8; - - // Work around the padding between the stmm registers as they are 16 - // byte structs with 10 bytes of the value in each - for (size_t i = 0; i < 8; ++i) { - memcpy(&m_state.context.fpu.no_avx.__fpu_stmm0 + i, p, 10); - p += 10; - } - // Copy the XMM registers in a single block memcpy(&m_state.context.fpu.no_avx.__fpu_xmm0, p, 16 * 16); p += 16 * 16; diff --git a/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h b/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h index 5ed67611e6ef..60e61262ab69 100644 --- a/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h +++ b/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h @@ -86,7 +86,7 @@ typedef struct { typedef struct { uint8_t __xmm_reg[16]; } __x86_64_xmm_reg; typedef struct { - int32_t __fpu_reserved[2]; + uint32_t __fpu_reserved[2]; __x86_64_fp_control_t __fpu_fcw; __x86_64_fp_status_t __fpu_fsw; uint8_t __fpu_ftw; @@ -125,7 +125,7 @@ typedef struct { __x86_64_xmm_reg __fpu_xmm14; __x86_64_xmm_reg __fpu_xmm15; uint8_t __fpu_rsrv4[6 * 16]; - int32_t __fpu_reserved1; + uint32_t __fpu_reserved1; } __x86_64_float_state_t; typedef struct { diff --git a/tools/debugserver/source/RNBRemote.cpp b/tools/debugserver/source/RNBRemote.cpp index 71c6f717cadf..4c1f27eb1cb8 100644 --- a/tools/debugserver/source/RNBRemote.cpp +++ b/tools/debugserver/source/RNBRemote.cpp @@ -3611,15 +3611,10 @@ rnb_err_t RNBRemote::HandlePacket_qSupported(const char *p) { snprintf(buf, sizeof(buf), "qXfer:features:read+;PacketSize=%x;qEcho+", max_packet_size); - // By default, don't enable compression. It's only worth doing when we are - // working - // with a low speed communication channel. bool enable_compression = false; (void)enable_compression; -// Enable compression when debugserver is running on a watchOS device where -// communication may be over Bluetooth. -#if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1 +#if (defined (TARGET_OS_WATCH) && TARGET_OS_WATCHOS == 1) || (defined (TARGET_OS_IOS) && TARGET_OS_IOS == 1) || (defined (TARGET_OS_TVOS) && TARGET_OS_TVOS == 1) enable_compression = true; #endif diff --git a/tools/driver/CMakeLists.txt b/tools/driver/CMakeLists.txt index 73f065d4357d..6384d5a92c2c 100644 --- a/tools/driver/CMakeLists.txt +++ b/tools/driver/CMakeLists.txt @@ -1,8 +1,25 @@ include(${LLDB_PROJECT_ROOT}/cmake/LLDBDependencies.cmake) +if ((CMAKE_SYSTEM_NAME MATCHES "Windows") OR + (CMAKE_SYSTEM_NAME MATCHES "NetBSD" )) + # These targets do not have getopt support, so they rely on the one provided by + # liblldb. However, getopt is not a part of the liblldb interface, so we have + # to link against the constituent libraries manually. Note that this is + # extremely scary as it introduces ODR violations, and it should go away as + # soon as possible. + set(host_lib lldbHost) +endif() + add_lldb_tool(lldb Driver.cpp Platform.cpp + + LINK_LIBS + liblldb + ${host_lib} + + LINK_COMPONENTS + Support ) if ( CMAKE_SYSTEM_NAME MATCHES "Windows" ) @@ -18,17 +35,3 @@ endif() if ( LLDB_CAN_USE_DEBUGSERVER ) add_dependencies(lldb debugserver) endif() - -target_link_libraries(lldb liblldb) -if ((CMAKE_SYSTEM_NAME MATCHES "Windows") OR - (CMAKE_SYSTEM_NAME MATCHES "NetBSD" )) - # These targets do not have getopt support, so they rely on the one provided by - # liblldb. However, getopt is not a part of the liblldb interface, so we have - # to link against the constituent libraries manually. Note that this is - # extremely scary as it introduces ODR violations, and it should go away as - # soon as possible. - target_link_libraries(lldb ${LLDB_USED_LIBS}) -endif() - -set_target_properties(lldb PROPERTIES VERSION ${LLDB_VERSION}) - diff --git a/tools/driver/Driver.h b/tools/driver/Driver.h index e6cff5180df9..2be697ccc44c 100644 --- a/tools/driver/Driver.h +++ b/tools/driver/Driver.h @@ -11,7 +11,7 @@ #define lldb_Driver_h_ #include "Platform.h" -#include "lldb/Utility/PseudoTerminal.h" +#include "lldb/Host/PseudoTerminal.h" #include <bitset> #include <set> diff --git a/tools/driver/Platform.h b/tools/driver/Platform.h index 3af2e19cbc42..521c5a1ccbb5 100644 --- a/tools/driver/Platform.h +++ b/tools/driver/Platform.h @@ -15,7 +15,6 @@ #include "lldb/Host/HostGetOpt.h" #include <io.h> #if defined(_MSC_VER) -#include <eh.h> #include <signal.h> #endif #include "lldb/Host/windows/windows.h" diff --git a/tools/intel-mpx/CMakeLists.txt b/tools/intel-mpx/CMakeLists.txt new file mode 100644 index 000000000000..29ba9a1cacec --- /dev/null +++ b/tools/intel-mpx/CMakeLists.txt @@ -0,0 +1,15 @@ +if (NOT CMAKE_SYSTEM_NAME MATCHES "Linux") + return () +endif () + +include(${LLDB_PROJECT_ROOT}/cmake/LLDBDependencies.cmake) + +add_library(lldb-intel-mpxtable SHARED + IntelMPXTablePlugin.cpp + ) + +target_link_libraries(lldb-intel-mpxtable + PUBLIC liblldb LLVMSupport) + +install(TARGETS lldb-intel-mpxtable + LIBRARY DESTINATION bin) diff --git a/tools/intel-mpx/IntelMPXTablePlugin.cpp b/tools/intel-mpx/IntelMPXTablePlugin.cpp new file mode 100644 index 000000000000..0f86ce661def --- /dev/null +++ b/tools/intel-mpx/IntelMPXTablePlugin.cpp @@ -0,0 +1,427 @@ +//===-- IntelMPXTablePlugin.cpp----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// C++ includes +#include <cerrno> +#include <string> + +// Project includes +#include "lldb/API/SBCommandInterpreter.h" +#include "lldb/API/SBCommandReturnObject.h" +#include "lldb/API/SBMemoryRegionInfo.h" +#include "lldb/API/SBProcess.h" +#include "lldb/API/SBTarget.h" +#include "lldb/API/SBThread.h" + +#include "llvm/ADT/Triple.h" + +namespace lldb { +bool PluginInitialize(lldb::SBDebugger debugger); +} + +static bool GetPtr(char *cptr, uint64_t &ptr, lldb::SBFrame &frame, + lldb::SBCommandReturnObject &result) { + if (!cptr) { + result.SetError("Bad argument."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + lldb::SBValue ptr_addr = frame.GetValueForVariablePath(cptr); + if (!ptr_addr.IsValid()) { + result.SetError("Invalid pointer."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + ptr = ptr_addr.GetLoadAddress(); + return true; +} + +enum { + mpx_base_mask_64 = ~(uint64_t)0xFFFULL, + mpx_bd_mask_64 = 0xFFFFFFF00000ULL, + bd_r_shift_64 = 20, + bd_l_shift_64 = 3, + bt_r_shift_64 = 3, + bt_l_shift_64 = 5, + bt_mask_64 = 0x0000000FFFF8ULL, + + mpx_base_mask_32 = 0xFFFFFFFFFFFFF000ULL, + mpx_bd_mask_32 = 0xFFFFF000ULL, + bd_r_shift_32 = 12, + bd_l_shift_32 = 2, + bt_r_shift_32 = 2, + bt_l_shift_32 = 4, + bt_mask_32 = 0x00000FFCULL, +}; + +static void PrintBTEntry(lldb::addr_t lbound, lldb::addr_t ubound, + uint64_t value, uint64_t meta, + lldb::SBCommandReturnObject &result) { + const lldb::addr_t one_cmpl64 = ~((lldb::addr_t)0); + const lldb::addr_t one_cmpl32 = ~((uint32_t)0); + + if ((lbound == one_cmpl64 || one_cmpl32) && ubound == 0) { + result.Printf("Null bounds on map: pointer value = 0x%lx\n", value); + } else { + result.Printf(" lbound = 0x%lx,", lbound); + result.Printf(" ubound = 0x%lx", ubound); + result.Printf(" (pointer value = 0x%lx,", value); + result.Printf(" metadata = 0x%lx)\n", meta); + } +} + +static bool GetBTEntryAddr(uint64_t bndcfgu, uint64_t ptr, + lldb::SBTarget &target, llvm::Triple::ArchType arch, + size_t &size, lldb::addr_t &bt_entry_addr, + lldb::SBCommandReturnObject &result, + lldb::SBError &error) { + lldb::addr_t mpx_base_mask; + lldb::addr_t mpx_bd_mask; + lldb::addr_t bd_r_shift; + lldb::addr_t bd_l_shift; + lldb::addr_t bt_r_shift; + lldb::addr_t bt_l_shift; + lldb::addr_t bt_mask; + + if (arch == llvm::Triple::ArchType::x86_64) { + mpx_base_mask = mpx_base_mask_64; + mpx_bd_mask = mpx_bd_mask_64; + bd_r_shift = bd_r_shift_64; + bd_l_shift = bd_l_shift_64; + bt_r_shift = bt_r_shift_64; + bt_l_shift = bt_l_shift_64; + bt_mask = bt_mask_64; + } else if (arch == llvm::Triple::ArchType::x86) { + mpx_base_mask = mpx_base_mask_32; + mpx_bd_mask = mpx_bd_mask_32; + bd_r_shift = bd_r_shift_32; + bd_l_shift = bd_l_shift_32; + bt_r_shift = bt_r_shift_32; + bt_l_shift = bt_l_shift_32; + bt_mask = bt_mask_32; + } else { + result.SetError("Invalid arch."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + size = target.GetAddressByteSize(); + lldb::addr_t mpx_bd_base = bndcfgu & mpx_base_mask; + lldb::addr_t bd_entry_offset = ((ptr & mpx_bd_mask) >> bd_r_shift) + << bd_l_shift; + lldb::addr_t bd_entry_addr = mpx_bd_base + bd_entry_offset; + + std::vector<uint8_t> bd_entry_v(size); + size_t ret = target.GetProcess().ReadMemory( + bd_entry_addr, static_cast<void *>(bd_entry_v.data()), size, error); + if (ret != size || !error.Success()) { + result.SetError("Failed access to BD entry."); + return false; + } + + lldb::SBData data; + data.SetData(error, bd_entry_v.data(), bd_entry_v.size(), + target.GetByteOrder(), size); + lldb::addr_t bd_entry = data.GetAddress(error, 0); + + if (!error.Success()) { + result.SetError("Failed access to BD entry."); + return false; + } + + if ((bd_entry & 0x01) == 0) { + result.SetError("Invalid bound directory."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + // Clear status bit. + // + bd_entry--; + + lldb::addr_t bt_addr = bd_entry & ~bt_r_shift; + lldb::addr_t bt_entry_offset = ((ptr & bt_mask) >> bt_r_shift) << bt_l_shift; + bt_entry_addr = bt_addr + bt_entry_offset; + + return true; +} + +static bool GetBTEntry(uint64_t bndcfgu, uint64_t ptr, lldb::SBTarget &target, + llvm::Triple::ArchType arch, + lldb::SBCommandReturnObject &result, + lldb::SBError &error) { + lldb::addr_t bt_entry_addr; + size_t size; + if (!GetBTEntryAddr(bndcfgu, ptr, target, arch, size, bt_entry_addr, result, + error)) + return false; + + // bt_entry_v must have space to store the 4 elements of the BT entry (lower + // boundary, + // upper boundary, pointer value and meta data), which all have the same size + // 'size'. + // + std::vector<uint8_t> bt_entry_v(size * 4); + size_t ret = target.GetProcess().ReadMemory( + bt_entry_addr, static_cast<void *>(bt_entry_v.data()), size * 4, error); + + if ((ret != (size * 4)) || !error.Success()) { + result.SetError("Unsuccessful. Failed access to BT entry."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + lldb::addr_t lbound; + lldb::addr_t ubound; + uint64_t value; + uint64_t meta; + lldb::SBData data; + data.SetData(error, bt_entry_v.data(), bt_entry_v.size(), + target.GetByteOrder(), size); + lbound = data.GetAddress(error, size * 0); + ubound = data.GetAddress(error, size * 1); + value = data.GetAddress(error, size * 2); + meta = data.GetAddress(error, size * 3); + // ubound is stored as one's complement. + if (arch == llvm::Triple::ArchType::x86) { + ubound = (~ubound) & 0x00000000FFFFFFFF; + } else { + ubound = ~ubound; + } + + if (!error.Success()) { + result.SetError("Failed access to BT entry."); + return false; + } + + PrintBTEntry(lbound, ubound, value, meta, result); + + result.SetStatus(lldb::eReturnStatusSuccessFinishResult); + return true; +} + +static std::vector<uint8_t> uIntToU8(uint64_t input, size_t size) { + std::vector<uint8_t> output; + for (size_t i = 0; i < size; i++) + output.push_back( + static_cast<uint8_t>((input & (0xFFULL << (i * 8))) >> (i * 8))); + + return output; +} + +static bool SetBTEntry(uint64_t bndcfgu, uint64_t ptr, lldb::addr_t lbound, + lldb::addr_t ubound, lldb::SBTarget &target, + llvm::Triple::ArchType arch, + lldb::SBCommandReturnObject &result, + lldb::SBError &error) { + lldb::addr_t bt_entry_addr; + size_t size; + + if (!GetBTEntryAddr(bndcfgu, ptr, target, arch, size, bt_entry_addr, result, + error)) + return false; + + // bt_entry_v must have space to store only 2 elements of the BT Entry, the + // lower boundary and the upper boundary, which both have size 'size'. + // + std::vector<uint8_t> bt_entry_v(size * 2); + + std::vector<uint8_t> lbound_v = uIntToU8(lbound, size); + bt_entry_v.insert(bt_entry_v.begin(), lbound_v.begin(), lbound_v.end()); + std::vector<uint8_t> ubound_v = uIntToU8(~ubound, size); + bt_entry_v.insert(bt_entry_v.begin() + size, ubound_v.begin(), + ubound_v.end()); + + size_t ret = target.GetProcess().WriteMemory( + bt_entry_addr, (void *)(bt_entry_v.data()), size * 2, error); + if ((ret != (size * 2)) || !error.Success()) { + result.SetError("Failed access to BT entry."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + result.SetStatus(lldb::eReturnStatusSuccessFinishResult); + return true; +} + +static bool GetInitInfo(lldb::SBDebugger debugger, lldb::SBTarget &target, + llvm::Triple::ArchType &arch, uint64_t &bndcfgu, + char *arg, uint64_t &ptr, + lldb::SBCommandReturnObject &result, + lldb::SBError &error) { + target = debugger.GetSelectedTarget(); + if (!target.IsValid()) { + result.SetError("Invalid target."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + const std::string triple_s(target.GetTriple()); + const llvm::Triple triple(triple_s); + + arch = triple.getArch(); + + if ((arch != llvm::Triple::ArchType::x86) && + (arch != llvm::Triple::ArchType::x86_64)) { + result.SetError("Platform not supported."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + lldb::SBFrame frame = + target.GetProcess().GetSelectedThread().GetSelectedFrame(); + if (!frame.IsValid()) { + result.SetError("No valid process, thread or frame."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + lldb::SBValue bndcfgu_val = frame.FindRegister("bndcfgu"); + if (!bndcfgu_val.IsValid()) { + result.SetError( + "Cannot access register BNDCFGU. Does the target support MPX?"); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + lldb::SBData bndcfgu_data = bndcfgu_val.GetData(); + bndcfgu = bndcfgu_data.GetUnsignedInt64(error, 0); + if (!error.Success()) { + result.SetError(error, "Invalid read of register BNDCFGU."); + return false; + } + + if (!GetPtr(arg, ptr, frame, result)) + return false; + + return true; +} + +class MPXTableShow : public lldb::SBCommandPluginInterface { +public: + virtual bool DoExecute(lldb::SBDebugger debugger, char **command, + lldb::SBCommandReturnObject &result) { + + if (command) { + int arg_c = 0; + char *arg; + + while (*command) { + if (arg_c >= 1) { + result.SetError("Too many arguments. See help."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + arg_c++; + arg = *command; + command++; + } + + if (!debugger.IsValid()) { + result.SetError("Invalid debugger."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } + + lldb::SBTarget target; + llvm::Triple::ArchType arch; + lldb::SBError error; + uint64_t bndcfgu; + uint64_t ptr; + + if (!GetInitInfo(debugger, target, arch, bndcfgu, arg, ptr, result, + error)) + return false; + + return GetBTEntry(bndcfgu, ptr, target, arch, result, error); + } + + result.SetError("Too few arguments. See help."); + result.SetStatus(lldb::eReturnStatusFailed); + return false; + } +}; + +class MPXTableSet : public lldb::SBCommandPluginInterface { +public: + virtual bool DoExecute(lldb::SBDebugger debugger, char **command, + lldb::SBCommandReturnObject &result) { + + if (command) { + int arg_c = 0; + char *arg[3]; + + while (*command) { + arg[arg_c] = *command; + command++; + arg_c++; + } + + if (arg_c != 3) { + result.SetError("Wrong arguments. See help."); + return false; + } + + if (!debugger.IsValid()) { + result.SetError("Invalid debugger."); + return false; + } + + lldb::SBTarget target; + llvm::Triple::ArchType arch; + lldb::SBError error; + uint64_t bndcfgu; + uint64_t ptr; + + if (!GetInitInfo(debugger, target, arch, bndcfgu, arg[0], ptr, result, + error)) + return false; + + char *endptr; + errno = 0; + uint64_t lbound = std::strtoul(arg[1], &endptr, 16); + if (endptr == arg[1] || errno == ERANGE) { + result.SetError("Lower Bound: bad argument format."); + errno = 0; + return false; + } + + uint64_t ubound = std::strtoul(arg[2], &endptr, 16); + if (endptr == arg[1] || errno == ERANGE) { + result.SetError("Upper Bound: bad argument format."); + errno = 0; + return false; + } + + return SetBTEntry(bndcfgu, ptr, lbound, ubound, target, arch, result, + error); + } + + result.SetError("Too few arguments. See help."); + return false; + } +}; + +bool lldb::PluginInitialize(lldb::SBDebugger debugger) { + lldb::SBCommandInterpreter interpreter = debugger.GetCommandInterpreter(); + lldb::SBCommand mpxTable = interpreter.AddMultiwordCommand( + "mpx-table", "A utility to access the MPX table entries."); + + const char *mpx_show_help = "Show the MPX table entry of a pointer.\n" + "mpx-table show <pointer>"; + mpxTable.AddCommand("show", new MPXTableShow(), mpx_show_help); + + const char *mpx_set_help = + "Set the MPX table entry of a pointer.\n" + "mpx-table set <pointer> <lower bound> <upper bound>"; + mpxTable.AddCommand("set", new MPXTableSet(), mpx_set_help); + + return true; +} diff --git a/tools/intel-mpx/test/Makefile b/tools/intel-mpx/test/Makefile new file mode 100644 index 000000000000..b18044407a70 --- /dev/null +++ b/tools/intel-mpx/test/Makefile @@ -0,0 +1,7 @@ +LEVEL = ../../../../make + +CXX_SOURCES := main.cpp + +CFLAGS_EXTRAS += -mmpx -fcheck-pointer-bounds -lmpxwrappers -lmpx -fuse-ld=bfd + +include $(LEVEL)/Makefile.rules diff --git a/tools/intel-mpx/test/README.txt b/tools/intel-mpx/test/README.txt new file mode 100644 index 000000000000..314e78d3e0eb --- /dev/null +++ b/tools/intel-mpx/test/README.txt @@ -0,0 +1,6 @@ +In order to run this test, create the following directory: + + packages/Python/lldbsuite/test/functionalities/plugins/commands/mpxtablecmd + +and copy into it the contents of this direcotry. + diff --git a/tools/intel-mpx/test/TestMPXTable.py b/tools/intel-mpx/test/TestMPXTable.py new file mode 100644 index 000000000000..f2468abd59a1 --- /dev/null +++ b/tools/intel-mpx/test/TestMPXTable.py @@ -0,0 +1,168 @@ +""" +Test mpx-table command. +""" + +from __future__ import print_function + + +import os +import time +import re +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestMPXTable(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + + @skipIf(compiler="clang") + @skipIf(oslist=no_match(['linux'])) + @skipIf(archs=no_match(['i386', 'x86_64'])) + @skipIf(compiler="gcc", compiler_version=["<", "5"]) #GCC version >= 5 supports Intel(R) MPX. + def test_show_command(self): + """Test 'mpx-table show' command""" + self.build() + + lldb_exec_dir = os.environ["LLDB_IMPLIB_DIR"] + lldb_lib_dir = os.path.join(lldb_exec_dir, os.pardir, "lib") + plugin_file = os.path.join(lldb_lib_dir, "liblldb-intel-mpxtable.so") + if not os.path.isfile(plugin_file): + self.skipTest("Intel(R) mpx-table plugin missing.") + plugin_command = " " + seq = ("plugin", "load", plugin_file) + plugin_command = plugin_command.join(seq) + self.runCmd(plugin_command) + + exe = os.path.join(os.getcwd(), "a.out") + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) + + self.b1 = line_number('main.cpp', '// Break 1.') + self.b2 = line_number('main.cpp', '// Break 2.') + self.b3 = line_number('main.cpp', '// Break 3.') + self.b4 = line_number('main.cpp', '// Break 4.') + lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.b1, num_expected_locations=1) + lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.b2, num_expected_locations=1) + lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.b3, num_expected_locations=1) + lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.b4, num_expected_locations=1) + self.runCmd("run", RUN_SUCCEEDED) + + target = self.dbg.GetSelectedTarget() + process = target.GetProcess() + + if (process.GetState() == lldb.eStateExited): + self.skipTest("Intel(R) MPX is not supported.") + else: + self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT, + substrs = ["stop reason = breakpoint 1."]) + + self.expect("mpx-table show a", + substrs = ['lbound = 0x', + ', ubound = 0x', + '(pointer value = 0x', + ', metadata = 0x', + ')'], + error = False) + + self.expect("continue", STOPPED_DUE_TO_BREAKPOINT, + substrs = ["stop reason = breakpoint 2."]) + + # Check that out of scope pointer cannot be reached. + # + self.expect("mpx-table show a", + substrs = ['Invalid pointer.'], + error = True) + + self.expect("mpx-table show tmp", + substrs = ['lbound = 0x', + ', ubound = 0x', + '(pointer value = 0x', + ', metadata = 0x', + ')'], + error = False) + + self.expect("continue", STOPPED_DUE_TO_BREAKPOINT, + substrs = ["stop reason = breakpoint 3."]) + + # Check that the pointer value is correctly updated. + # + self.expect("mpx-table show tmp", + substrs = ['lbound = 0x', + ', ubound = 0x', + '(pointer value = 0x2', + ', metadata = 0x', + ')'], + error = False) + + self.expect("continue", STOPPED_DUE_TO_BREAKPOINT, + substrs = ["stop reason = breakpoint 4."]) + + # After going back to main(), check that out of scope pointer cannot be + # reached. + # + self.expect("mpx-table show tmp", + substrs = ['Invalid pointer.'], + error = True) + + self.expect("mpx-table show a", + substrs = ['lbound = 0x', + ', ubound = 0x', + '(pointer value = 0x', + ', metadata = 0x', + ')'], + error = False) + + def test_set_command(self): + """Test 'mpx-table set' command""" + self.build() + + lldb_exec_dir = os.environ["LLDB_IMPLIB_DIR"] + lldb_lib_dir = os.path.join(lldb_exec_dir, os.pardir, "lib") + plugin_file = os.path.join(lldb_lib_dir, "liblldb-intel-mpxtable.so") + if not os.path.isfile(plugin_file): + self.skipTest("Intel(R) mpx-table plugin missing.") + plugin_command = " " + seq = ("plugin", "load", plugin_file) + plugin_command = plugin_command.join(seq) + self.runCmd(plugin_command) + + exe = os.path.join(os.getcwd(), "a.out") + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) + + self.b1 = line_number('main.cpp', '// Break 1.') + lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.b1, num_expected_locations=1) + self.runCmd("run", RUN_SUCCEEDED) + + target = self.dbg.GetSelectedTarget() + process = target.GetProcess() + + if (process.GetState() == lldb.eStateExited): + self.skipTest("Intel(R) MPX is not supported.") + else: + self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT, + substrs = ["stop reason = breakpoint 1."]) + + # Check that the BT Entry doesn't already contain the test values. + # + self.expect("mpx-table show a", matching=False, + substrs = ['lbound = 0xcafecafe', + ', ubound = 0xbeefbeef']) + + # Set the test values. + # + self.expect("mpx-table set a 0xcafecafe 0xbeefbeef", error = False) + + # Verify that the test values have been correctly written in the BT + # entry. + # + self.expect("mpx-table show a", + substrs = ['lbound = 0xcafecafe', + ', ubound = 0xbeefbeef'], + error = False) + + diff --git a/tools/intel-mpx/test/main.cpp b/tools/intel-mpx/test/main.cpp new file mode 100644 index 000000000000..214332338d87 --- /dev/null +++ b/tools/intel-mpx/test/main.cpp @@ -0,0 +1,48 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +//// +//// The LLVM Compiler Infrastructure +//// +//// This file is distributed under the University of Illinois Open Source +//// License. See LICENSE.TXT for details. +//// +////===----------------------------------------------------------------------===// +// + +const int size = 5; + +#include <cstddef> +#include <cstdlib> +#include <sys/prctl.h> + +void func(int *ptr) { + int *tmp; + +#if defined __GNUC__ && !defined __INTEL_COMPILER + __builtin___bnd_store_ptr_bounds ((void**)&ptr, ptr); +#endif + tmp = ptr + size - 1; +#if defined __GNUC__ && !defined __INTEL_COMPILER + __builtin___bnd_store_ptr_bounds ((void**)&tmp, tmp); +#endif + tmp = (int*)0x2; // Break 2. + + return; // Break 3. +} + +int +main(int argc, char const *argv[]) +{ + // This call returns 0 only if the CPU and the kernel support Intel(R) MPX. + if (prctl(PR_MPX_ENABLE_MANAGEMENT, 0, 0, 0, 0) != 0) + return -1; + + int* a = (int *) calloc(size, sizeof(int)); +#if defined __GNUC__ && !defined __INTEL_COMPILER + __builtin___bnd_store_ptr_bounds ((void**)&a, a); +#endif + func(a); // Break 1. + + free(a); // Break 4. + + return 0; +} diff --git a/tools/lldb-mi/CMakeLists.txt b/tools/lldb-mi/CMakeLists.txt index f7e0581a451d..f3f4c0097efd 100644 --- a/tools/lldb-mi/CMakeLists.txt +++ b/tools/lldb-mi/CMakeLists.txt @@ -1,4 +1,16 @@ -set(LLDB_MI_SOURCES +if ( CMAKE_SYSTEM_NAME MATCHES "Windows" OR CMAKE_SYSTEM_NAME MATCHES "NetBSD" ) + add_definitions( -DIMPORT_LIBLLDB ) + list(APPEND extra_libs lldbHost) +endif () + +if (HAVE_LIBPTHREAD) + list(APPEND extra_libs pthread) +endif () + +# We need to include the llvm components we depend on manually, as liblldb does +# not re-export those. +set(LLVM_LINK_COMPONENTS Support) +add_lldb_tool(lldb-mi MICmdArgContext.cpp MICmdArgSet.cpp MICmdArgValBase.cpp @@ -72,23 +84,12 @@ set(LLDB_MI_SOURCES MIUtilString.cpp MIUtilThreadBaseStd.cpp MIUtilVariant.cpp - ) -if ( CMAKE_SYSTEM_NAME MATCHES "Windows" OR CMAKE_SYSTEM_NAME MATCHES "NetBSD" ) - add_definitions( -DIMPORT_LIBLLDB ) - list(APPEND LLDB_MI_SOURCES - ${LLDB_SOURCE_ROOT}/Host/common/GetOptInc.cpp - ) -endif () + LINK_LIBS + liblldb + ${host_lib} + ${extra_libs} -# We need to include the llvm components we depend on manually, as liblldb does -# not re-export those. -set(LLVM_LINK_COMPONENTS Support) -add_lldb_tool(lldb-mi ${LLDB_MI_SOURCES}) - -target_link_libraries(lldb-mi liblldb) -if (HAVE_LIBPTHREAD) - target_link_libraries(lldb-mi pthread) -endif () - -set_target_properties(lldb-mi PROPERTIES VERSION ${LLDB_VERSION}) + LINK_COMPONENTS + Support + ) diff --git a/tools/lldb-mi/MICmdCmdStack.cpp b/tools/lldb-mi/MICmdCmdStack.cpp index 9160c401094a..b491027bf80e 100644 --- a/tools/lldb-mi/MICmdCmdStack.cpp +++ b/tools/lldb-mi/MICmdCmdStack.cpp @@ -32,6 +32,8 @@ #include "MICmnMIResultRecord.h" #include "MICmnMIValueConst.h" +#include <algorithm> + //++ //------------------------------------------------------------------------------------ // Details: CMICmdCmdStackInfoDepth constructor. @@ -757,7 +759,8 @@ bool CMICmdCmdStackListLocals::Execute() { : thread.GetSelectedFrame(); CMICmnMIValueList miValueList(true); - const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Locals; + const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Locals | + CMICmnLLDBDebugSessionInfo::eVariableType_InScope; if (!rSessionInfo.MIResponseFormVariableInfo(frame, maskVarTypes, eVarInfoFormat, miValueList)) return MIstatus::failure; @@ -929,7 +932,8 @@ bool CMICmdCmdStackListVariables::Execute() { CMICmnMIValueList miValueList(true); const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Arguments | - CMICmnLLDBDebugSessionInfo::eVariableType_Locals; + CMICmnLLDBDebugSessionInfo::eVariableType_Locals | + CMICmnLLDBDebugSessionInfo::eVariableType_InScope; if (!rSessionInfo.MIResponseFormVariableInfo( frame, maskVarTypes, eVarInfoFormat, miValueList, 10, true)) return MIstatus::failure; diff --git a/tools/lldb-mi/MICmdCmdVar.cpp b/tools/lldb-mi/MICmdCmdVar.cpp index 1efbd0b31e75..3396b7231c5c 100644 --- a/tools/lldb-mi/MICmdCmdVar.cpp +++ b/tools/lldb-mi/MICmdCmdVar.cpp @@ -38,6 +38,8 @@ #include "MICmnMIResultRecord.h" #include "MICmnMIValueConst.h" +#include <algorithm> + //++ //------------------------------------------------------------------------------------ // Details: CMICmdCmdVarCreate constructor. @@ -182,7 +184,7 @@ bool CMICmdCmdVarCreate::Execute() { const bool bArgs = true; const bool bLocals = true; const bool bStatics = true; - const bool bInScopeOnly = false; + const bool bInScopeOnly = true; const lldb::SBValueList valueList = frame.GetVariables(bArgs, bLocals, bStatics, bInScopeOnly); value = valueList.GetFirstValueByName(rStrExpression.c_str()); diff --git a/tools/lldb-mi/MICmnBase.cpp b/tools/lldb-mi/MICmnBase.cpp index 52100e79c781..63544dc5b9c7 100644 --- a/tools/lldb-mi/MICmnBase.cpp +++ b/tools/lldb-mi/MICmnBase.cpp @@ -122,7 +122,7 @@ void CMICmnBase::ClrErrorDescription() const { // Return: None. // Throws: None. //-- -void CMICmnBase::SetErrorDescriptionn(const CMIUtilString vFormat, ...) const { +void CMICmnBase::SetErrorDescriptionn(const char *vFormat, ...) const { va_list args; va_start(args, vFormat); CMIUtilString strResult = CMIUtilString::FormatValist(vFormat, args); diff --git a/tools/lldb-mi/MICmnBase.h b/tools/lldb-mi/MICmnBase.h index f739493cc210..2b604638b2dc 100644 --- a/tools/lldb-mi/MICmnBase.h +++ b/tools/lldb-mi/MICmnBase.h @@ -28,7 +28,7 @@ public: bool HaveErrorDescription() const; const CMIUtilString &GetErrorDescription() const; void SetErrorDescription(const CMIUtilString &vrTxt) const; - void SetErrorDescriptionn(const CMIUtilString vFormat, ...) const; + void SetErrorDescriptionn(const char *vFormat, ...) const; void SetErrorDescriptionNoLog(const CMIUtilString &vrTxt) const; void ClrErrorDescription() const; diff --git a/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp b/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp index e975dd6525e5..a61244f92fc2 100644 --- a/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp +++ b/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp @@ -40,6 +40,8 @@ #include "MIUtilDebug.h" #include "Platform.h" // for PATH_MAX +#include <algorithm> + //++ //------------------------------------------------------------------------------------ // Details: CMICmnLLDBDebuggerHandleEvents constructor. diff --git a/tools/lldb-mi/MIDriver.cpp b/tools/lldb-mi/MIDriver.cpp index eec37382cbfb..ea8b57297dda 100644 --- a/tools/lldb-mi/MIDriver.cpp +++ b/tools/lldb-mi/MIDriver.cpp @@ -509,7 +509,7 @@ bool CMIDriver::StartWorkerThreads() { const CMIUtilString errMsg = CMIUtilString::Format( MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), CMICmnThreadMgrStd::Instance().GetErrorDescription().c_str()); - SetErrorDescriptionn(errMsg); + SetErrorDescription(errMsg); return MIstatus::failure; } diff --git a/tools/lldb-mi/MIUtilString.cpp b/tools/lldb-mi/MIUtilString.cpp index 3e6911f68189..45196a70398d 100644 --- a/tools/lldb-mi/MIUtilString.cpp +++ b/tools/lldb-mi/MIUtilString.cpp @@ -157,7 +157,7 @@ CMIUtilString CMIUtilString::FormatPriv(const CMIUtilString &vrFormat, // Return: CMIUtilString - Number of splits found in the string data. // Throws: None. //-- -CMIUtilString CMIUtilString::Format(const CMIUtilString vFormating, ...) { +CMIUtilString CMIUtilString::Format(const char *vFormating, ...) { va_list args; va_start(args, vFormating); CMIUtilString strResult = CMIUtilString::FormatPriv(vFormating, args); diff --git a/tools/lldb-mi/MIUtilString.h b/tools/lldb-mi/MIUtilString.h index 3b077722f9a9..2639141d0fb2 100644 --- a/tools/lldb-mi/MIUtilString.h +++ b/tools/lldb-mi/MIUtilString.h @@ -30,7 +30,7 @@ public: // Static method: public: - static CMIUtilString Format(const CMIUtilString vFormating, ...); + static CMIUtilString Format(const char *vFormating, ...); static CMIUtilString FormatBinary(const MIuint64 vnDecimal); static CMIUtilString FormatValist(const CMIUtilString &vrFormating, va_list vArgs); diff --git a/tools/lldb-mi/MIUtilThreadBaseStd.h b/tools/lldb-mi/MIUtilThreadBaseStd.h index cfff7d459b42..20b8fad9947a 100644 --- a/tools/lldb-mi/MIUtilThreadBaseStd.h +++ b/tools/lldb-mi/MIUtilThreadBaseStd.h @@ -10,9 +10,6 @@ #pragma once // Third party headers: -#ifdef _MSC_VER -#include <eh.h> -#endif // _MSC_VER #include <mutex> #include <thread> diff --git a/tools/lldb-mi/Platform.h b/tools/lldb-mi/Platform.h index 1b6ff5549925..ce2de1b6e97d 100644 --- a/tools/lldb-mi/Platform.h +++ b/tools/lldb-mi/Platform.h @@ -10,7 +10,6 @@ #if defined(_MSC_VER) -#include <eh.h> #include <inttypes.h> #include <io.h> #include <signal.h> diff --git a/tools/lldb-server/Acceptor.cpp b/tools/lldb-server/Acceptor.cpp index 00a0bda175fb..e6e73f8bdb6b 100644 --- a/tools/lldb-server/Acceptor.cpp +++ b/tools/lldb-server/Acceptor.cpp @@ -12,11 +12,10 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/ScopedPrinter.h" -#include "lldb/Core/StreamString.h" #include "lldb/Host/ConnectionFileDescriptor.h" #include "lldb/Host/common/TCPSocket.h" - -#include "Utility/UriParser.h" +#include "lldb/Utility/StreamString.h" +#include "lldb/Utility/UriParser.h" using namespace lldb; using namespace lldb_private; diff --git a/tools/lldb-server/Acceptor.h b/tools/lldb-server/Acceptor.h index f0638ef1ae69..410970915f1f 100644 --- a/tools/lldb-server/Acceptor.h +++ b/tools/lldb-server/Acceptor.h @@ -10,8 +10,8 @@ #define lldb_server_Acceptor_h_ #include "lldb/Core/Connection.h" -#include "lldb/Core/Error.h" #include "lldb/Host/Socket.h" +#include "lldb/Utility/Error.h" #include <functional> #include <memory> diff --git a/tools/lldb-server/CMakeLists.txt b/tools/lldb-server/CMakeLists.txt index c3b405f67b2e..4f76ebd6881c 100644 --- a/tools/lldb-server/CMakeLists.txt +++ b/tools/lldb-server/CMakeLists.txt @@ -17,96 +17,13 @@ endif () if ( CMAKE_SYSTEM_NAME MATCHES "NetBSD" ) include_directories( ../../../../llvm/include + ../../source/Plugins/Process/NetBSD ../../source/Plugins/Process/POSIX ) endif () include_directories(../../source) - -set( LLDB_USED_LIBS - lldbBase - lldbBreakpoint - lldbCommands - lldbDataFormatters - lldbHost - lldbCore - lldbExpression - lldbInitialization - lldbInterpreter - lldbSymbol - lldbTarget - lldbUtility - - # Plugins - lldbPluginDisassemblerLLVM - lldbPluginSymbolFileDWARF - lldbPluginSymbolFilePDB - lldbPluginSymbolFileSymtab - lldbPluginDynamicLoaderPosixDYLD - - lldbPluginCPlusPlusLanguage - lldbPluginGoLanguage - lldbPluginJavaLanguage - lldbPluginObjCLanguage - lldbPluginObjCPlusPlusLanguage - lldbPluginOCamlLanguage - - lldbPluginObjectFileELF - lldbPluginObjectFileJIT - lldbPluginSymbolVendorELF - lldbPluginPlatformPOSIX - lldbPluginObjectContainerBSDArchive - lldbPluginObjectContainerMachOArchive - lldbPluginProcessGDBRemote - lldbPluginProcessUtility - lldbPluginObjectContainerMachOArchive - lldbPluginObjectContainerBSDArchive - lldbPluginPlatformMacOSX - lldbPluginUnwindAssemblyInstEmulation - lldbPluginUnwindAssemblyX86 - lldbPluginAppleObjCRuntime - lldbPluginCXXItaniumABI - lldbPluginInstructionARM - lldbPluginInstructionARM64 - lldbPluginInstructionMIPS - lldbPluginInstructionMIPS64 - lldbPluginObjectFilePECOFF - lldbPluginExpressionParserClang - lldbPluginExpressionParserGo - ) - -# Linux-only libraries -if ( CMAKE_SYSTEM_NAME MATCHES "Linux" ) - list(APPEND LLDB_USED_LIBS - lldbPluginProcessLinux - lldbPluginProcessPOSIX - ) -endif () - -# Darwin-only libraries -if ( CMAKE_SYSTEM_NAME MATCHES "Darwin" ) - list(APPEND LLDB_USED_LIBS - lldbPluginObjectFileMachO - ) -endif() - -set( CLANG_USED_LIBS - clangAnalysis - clangAST - clangBasic - clangCodeGen - clangDriver - clangEdit - clangFrontend - clangLex - clangParse - clangRewrite - clangRewriteFrontend - clangSema - clangSerialization - ) - set(LLDB_SYSTEM_LIBS) if (NOT LLDB_DISABLE_LIBEDIT) list(APPEND LLDB_SYSTEM_LIBS edit) @@ -142,55 +59,24 @@ if (LLVM_BUILD_STATIC) endif() endif() -set(LLVM_LINK_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} - interpreter - asmparser - bitreader - bitwriter - codegen - demangle - ipo - selectiondag - bitreader - mc - mcjit - core - mcdisassembler - executionengine - runtimedyld - option - support - coverage - target - ) - add_lldb_tool(lldb-server INCLUDE_IN_FRAMEWORK Acceptor.cpp lldb-gdbserver.cpp lldb-platform.cpp lldb-server.cpp LLDBServerUtilities.cpp -) -# The Darwin linker doesn't understand --start-group/--end-group. -if (LLDB_LINKER_SUPPORTS_GROUPS) - target_link_libraries(lldb-server - -Wl,--start-group ${LLDB_USED_LIBS} -Wl,--end-group) - target_link_libraries(lldb-server - -Wl,--start-group ${CLANG_USED_LIBS} -Wl,--end-group) -else() - target_link_libraries(lldb-server ${LLDB_USED_LIBS}) - target_link_libraries(lldb-server ${CLANG_USED_LIBS}) -endif() -if(NOT LLVM_LINK_LLVM_DYLIB) - # This is necessary in !LLVM_LINK_LLVM_DYLIB as LLDB's libs do not track their - # dependencies properly. It is conditional because in a LLVM_LINK_LLVM_DYLIB - # build it would introduce duplicate symbols (add_lldb_tool links to libLLVM, - # and this would add the individual .a files as well). - llvm_config(lldb-server ${LLVM_LINK_COMPONENTS}) -endif() + LINK_LIBS + lldbBase + lldbCore + lldbHost + lldbInitialization + lldbInterpreter + ${EXTRA_LLDB_LIBS} + ${LLDB_SYSTEM_LIBS} + + LINK_COMPONENTS + Support +) target_link_libraries(lldb-server ${LLDB_SYSTEM_LIBS}) - -set_target_properties(lldb-server PROPERTIES VERSION ${LLDB_VERSION}) diff --git a/tools/lldb-server/LLDBServerUtilities.cpp b/tools/lldb-server/LLDBServerUtilities.cpp index 86d8469933e7..e784a3a82684 100644 --- a/tools/lldb-server/LLDBServerUtilities.cpp +++ b/tools/lldb-server/LLDBServerUtilities.cpp @@ -9,47 +9,55 @@ #include "LLDBServerUtilities.h" -#include "lldb/Core/Log.h" #include "lldb/Core/StreamFile.h" -#include "lldb/Core/StreamString.h" #include "lldb/Interpreter/Args.h" +#include "lldb/Utility/Log.h" +#include "lldb/Utility/StreamString.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/FileSystem.h" using namespace lldb; using namespace lldb_private::lldb_server; using namespace llvm; +static std::shared_ptr<raw_ostream> GetLogStream(StringRef log_file) { + if (!log_file.empty()) { + std::error_code EC; + std::shared_ptr<raw_ostream> stream_sp = std::make_shared<raw_fd_ostream>( + log_file, EC, sys::fs::F_Text | sys::fs::F_Append); + if (!EC) + return stream_sp; + errs() << llvm::formatv( + "Failed to open log file `{0}`: {1}\nWill log to stderr instead.\n", + log_file, EC.message()); + } + // No need to delete the stderr stream. + return std::shared_ptr<raw_ostream>(&errs(), [](raw_ostream *) {}); +} + bool LLDBServerUtilities::SetupLogging(const std::string &log_file, const StringRef &log_channels, uint32_t log_options) { - lldb::StreamSP log_stream_sp; - if (log_file.empty()) { - log_stream_sp.reset(new StreamFile(stdout, false)); - } else { - uint32_t options = File::eOpenOptionWrite | File::eOpenOptionCanCreate | - File::eOpenOptionCloseOnExec | File::eOpenOptionAppend; - if (!(log_options & LLDB_LOG_OPTION_APPEND)) - options |= File::eOpenOptionTruncate; - - log_stream_sp.reset(new StreamFile(log_file.c_str(), options)); - } + + auto log_stream_sp = GetLogStream(log_file); SmallVector<StringRef, 32> channel_array; log_channels.split(channel_array, ":", /*MaxSplit*/ -1, /*KeepEmpty*/ false); for (auto channel_with_categories : channel_array) { - StreamString error_stream; + std::string error; + llvm::raw_string_ostream error_stream(error); Args channel_then_categories(channel_with_categories); std::string channel(channel_then_categories.GetArgumentAtIndex(0)); channel_then_categories.Shift(); // Shift off the channel bool success = Log::EnableLogChannel( - log_stream_sp, log_options, channel.c_str(), - channel_then_categories.GetConstArgumentVector(), error_stream); + log_stream_sp, log_options, channel, + channel_then_categories.GetArgumentArrayRef(), error_stream); if (!success) { - fprintf(stderr, "Unable to open log file '%s' for channel \"%s\"\n", - log_file.c_str(), channel_with_categories.str().c_str()); + errs() << formatv("Unable to setup logging for channel \"{0}\": {1}", + channel, error_stream.str()); return false; } } diff --git a/tools/lldb-server/lldb-gdbserver.cpp b/tools/lldb-server/lldb-gdbserver.cpp index 5a388722b3c2..59f5a44ce4e3 100644 --- a/tools/lldb-server/lldb-gdbserver.cpp +++ b/tools/lldb-server/lldb-gdbserver.cpp @@ -28,7 +28,6 @@ #include "LLDBServerUtilities.h" #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h" #include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h" -#include "lldb/Core/Error.h" #include "lldb/Core/PluginManager.h" #include "lldb/Host/ConnectionFileDescriptor.h" #include "lldb/Host/HostGetOpt.h" @@ -36,6 +35,7 @@ #include "lldb/Host/Pipe.h" #include "lldb/Host/Socket.h" #include "lldb/Host/StringConvert.h" +#include "lldb/Utility/Error.h" #ifndef LLGS_PROGRAM_NAME #define LLGS_PROGRAM_NAME "lldb-server" @@ -424,11 +424,13 @@ int main_gdbserver(int argc, char *argv[]) { exit(option_error); } - if (!LLDBServerUtilities::SetupLogging(log_file, log_channels, - LLDB_LOG_OPTION_PREPEND_TIMESTAMP)) + if (!LLDBServerUtilities::SetupLogging( + log_file, log_channels, + LLDB_LOG_OPTION_PREPEND_TIMESTAMP | + LLDB_LOG_OPTION_PREPEND_FILE_FUNCTION)) return -1; - Log *log(lldb_private::GetLogIfAnyCategoriesSet(GDBR_LOG_VERBOSE)); + Log *log(lldb_private::GetLogIfAnyCategoriesSet(GDBR_LOG_PROCESS)); if (log) { log->Printf("lldb-server launch"); for (int i = 0; i < argc; i++) { diff --git a/tools/lldb-server/lldb-platform.cpp b/tools/lldb-server/lldb-platform.cpp index 1772921b0faf..d9790cdf43a0 100644 --- a/tools/lldb-server/lldb-platform.cpp +++ b/tools/lldb-server/lldb-platform.cpp @@ -30,13 +30,12 @@ #include "LLDBServerUtilities.h" #include "Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.h" #include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h" -#include "lldb/Core/Error.h" #include "lldb/Host/ConnectionFileDescriptor.h" -#include "lldb/Host/FileSpec.h" -#include "lldb/Host/FileSystem.h" #include "lldb/Host/HostGetOpt.h" #include "lldb/Host/OptionParser.h" #include "lldb/Host/common/TCPSocket.h" +#include "lldb/Utility/Error.h" +#include "lldb/Utility/FileSpec.h" using namespace lldb; using namespace lldb_private; @@ -102,29 +101,30 @@ static void display_usage(const char *progname, const char *subcommand) { static Error save_socket_id_to_file(const std::string &socket_id, const FileSpec &file_spec) { FileSpec temp_file_spec(file_spec.GetDirectory().AsCString(), false); - auto error = FileSystem::MakeDirectory(temp_file_spec, - eFilePermissionsDirectoryDefault); + Error error(llvm::sys::fs::create_directory(temp_file_spec.GetPath())); if (error.Fail()) return Error("Failed to create directory %s: %s", temp_file_spec.GetCString(), error.AsCString()); - llvm::SmallString<PATH_MAX> temp_file_path; + llvm::SmallString<64> temp_file_path; temp_file_spec.AppendPathComponent("port-file.%%%%%%"); - auto err_code = llvm::sys::fs::createUniqueFile(temp_file_spec.GetCString(), + int FD; + auto err_code = llvm::sys::fs::createUniqueFile(temp_file_spec.GetPath(), FD, temp_file_path); if (err_code) return Error("Failed to create temp file: %s", err_code.message().c_str()); - llvm::FileRemover tmp_file_remover(temp_file_path.c_str()); + llvm::FileRemover tmp_file_remover(temp_file_path); { - std::ofstream temp_file(temp_file_path.c_str(), std::ios::out); - if (!temp_file.is_open()) - return Error("Failed to open temp file %s", temp_file_path.c_str()); + llvm::raw_fd_ostream temp_file(FD, true); temp_file << socket_id; + temp_file.close(); + if (temp_file.has_error()) + return Error("Failed to write to port file."); } - err_code = llvm::sys::fs::rename(temp_file_path.c_str(), file_spec.GetPath()); + err_code = llvm::sys::fs::rename(temp_file_path, file_spec.GetPath()); if (err_code) return Error("Failed to rename file %s to %s: %s", temp_file_path.c_str(), file_spec.GetPath().c_str(), err_code.message().c_str()); |