https://github.com/HemangGadhavi updated https://github.com/llvm/llvm-project/pull/134354
>From e7b3d8d95477f96b4c1b1a2bbec5cce49f4c15cd Mon Sep 17 00:00:00 2001 From: HemangGadhavi <hemang.gadh...@ibm.com> Date: Fri, 4 Apr 2025 00:59:17 -0500 Subject: [PATCH 1/4] [lldb][AIX] get host info for AIX --- lldb/source/Host/CMakeLists.txt | 1 + lldb/source/Host/aix/Host.cpp | 156 +++++++++++++++++++++++++++++++- 2 files changed, 156 insertions(+), 1 deletion(-) diff --git a/lldb/source/Host/CMakeLists.txt b/lldb/source/Host/CMakeLists.txt index a2ae6f1430c38..a02b1c104396e 100644 --- a/lldb/source/Host/CMakeLists.txt +++ b/lldb/source/Host/CMakeLists.txt @@ -141,6 +141,7 @@ else() add_host_subdirectory(aix aix/Host.cpp aix/HostInfoAIX.cpp + linux/Support.cpp ) endif() endif() diff --git a/lldb/source/Host/aix/Host.cpp b/lldb/source/Host/aix/Host.cpp index 751c4fbcc9368..6ba3e05348df1 100644 --- a/lldb/source/Host/aix/Host.cpp +++ b/lldb/source/Host/aix/Host.cpp @@ -6,18 +6,172 @@ // //===----------------------------------------------------------------------===// +#include <fcntl.h> +#include <sstream> +#include <sys/procfs.h> + #include "lldb/Host/Host.h" +#include "lldb/Host/linux/Support.h" +#include "lldb/Utility/LLDBLog.h" +#include "lldb/Utility/Log.h" +#include "lldb/Utility/ProcessInfo.h" #include "lldb/Utility/Status.h" +#include "llvm/BinaryFormat/XCOFF.h" +using namespace llvm; +using namespace lldb; using namespace lldb_private; +namespace { +enum class ProcessState { + Unknown, + Dead, + DiskSleep, + Idle, + Paging, + Parked, + Running, + Sleeping, + TracedOrStopped, + Zombie, +}; +} + +static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, + ProcessState &State, ::pid_t &TracerPid, + ::pid_t &Tgid) { + Log *log = GetLog(LLDBLog::Host); + + auto BufferOrError = getProcFile(Pid, "status"); + if (!BufferOrError) + return false; + + llvm::StringRef Rest = BufferOrError.get()->getBuffer(); + while (!Rest.empty()) { + llvm::StringRef Line; + std::tie(Line, Rest) = Rest.split('\n'); + + if (Line.consume_front("Gid:")) { + // Real, effective, saved set, and file system GIDs. Read the first two. + Line = Line.ltrim(); + uint32_t RGid, EGid; + Line.consumeInteger(10, RGid); + Line = Line.ltrim(); + Line.consumeInteger(10, EGid); + + ProcessInfo.SetGroupID(RGid); + ProcessInfo.SetEffectiveGroupID(EGid); + } else if (Line.consume_front("Uid:")) { + // Real, effective, saved set, and file system UIDs. Read the first two. + Line = Line.ltrim(); + uint32_t RUid, EUid; + Line.consumeInteger(10, RUid); + Line = Line.ltrim(); + Line.consumeInteger(10, EUid); + + ProcessInfo.SetUserID(RUid); + ProcessInfo.SetEffectiveUserID(EUid); + } else if (Line.consume_front("PPid:")) { + ::pid_t PPid; + Line.ltrim().consumeInteger(10, PPid); + ProcessInfo.SetParentProcessID(PPid); + } else if (Line.consume_front("State:")) { + State = llvm::StringSwitch<ProcessState>(Line.ltrim().take_front(1)) + .Case("D", ProcessState::DiskSleep) + .Case("I", ProcessState::Idle) + .Case("R", ProcessState::Running) + .Case("S", ProcessState::Sleeping) + .CaseLower("T", ProcessState::TracedOrStopped) + .Case("W", ProcessState::Paging) + .Case("P", ProcessState::Parked) + .Case("X", ProcessState::Dead) + .Case("Z", ProcessState::Zombie) + .Default(ProcessState::Unknown); + if (State == ProcessState::Unknown) { + LLDB_LOG(log, "Unknown process state {0}", Line); + } + } else if (Line.consume_front("TracerPid:")) { + Line = Line.ltrim(); + Line.consumeInteger(10, TracerPid); + } else if (Line.consume_front("Tgid:")) { + Line = Line.ltrim(); + Line.consumeInteger(10, Tgid); + } + } + return true; +} + +static void GetExePathAndArch(::pid_t pid, ProcessInstanceInfo &process_info) { + Log *log = GetLog(LLDBLog::Process); + std::string ExePath(PATH_MAX, '\0'); + struct psinfo psinfoData; + + // We can't use getProcFile here because proc/[pid]/exe is a symbolic link. + llvm::SmallString<64> ProcExe; + (llvm::Twine("/proc/") + llvm::Twine(pid) + "/cwd").toVector(ProcExe); + + ssize_t len = readlink(ProcExe.c_str(), &ExePath[0], PATH_MAX); + if (len > 0) { + ExePath.resize(len); + + struct stat statData; + + std::ostringstream oss; + + oss << "/proc/" << std::dec << pid << "/psinfo"; + assert(stat(oss.str().c_str(), &statData) == 0); + + const int fd = open(oss.str().c_str(), O_RDONLY); + assert(fd >= 0); + + ssize_t readNum = read(fd, &psinfoData, sizeof(psinfoData)); + assert(readNum >= 0); + + close(fd); + } else { + LLDB_LOG(log, "failed to read link exe link for {0}: {1}", pid, + Status(errno, eErrorTypePOSIX)); + ExePath.resize(0); + } + + llvm::StringRef PathRef(&(psinfoData.pr_psargs[0])); + + if (!PathRef.empty()) { + process_info.GetExecutableFile().SetFile(PathRef, FileSpec::Style::native); + ArchSpec arch_spec = ArchSpec(); + arch_spec.SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64, + LLDB_INVALID_CPUTYPE, llvm::Triple::AIX); + process_info.SetArchitecture(arch_spec); + } +} + +static bool GetProcessAndStatInfo(::pid_t pid, + ProcessInstanceInfo &process_info, + ProcessState &State, ::pid_t &tracerpid) { + ::pid_t tgid; + tracerpid = 0; + process_info.Clear(); + + process_info.SetProcessID(pid); + + GetExePathAndArch(pid, process_info); + + // Get User and Group IDs and get tracer pid. + if (!GetStatusInfo(pid, process_info, State, tracerpid, tgid)) + return false; + + return true; +} + uint32_t Host::FindProcessesImpl(const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos) { return 0; } bool Host::GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &process_info) { - return false; + ::pid_t tracerpid; + ProcessState State; + return GetProcessAndStatInfo(pid, process_info, State, tracerpid); } Status Host::ShellExpandArguments(ProcessLaunchInfo &launch_info) { >From 3ea41b00f9702cd20c1b762432ede2dcc3befbb8 Mon Sep 17 00:00:00 2001 From: HemangGadhavi <hemang.gadh...@ibm.com> Date: Thu, 10 Apr 2025 06:16:36 -0500 Subject: [PATCH 2/4] Addressed review comments --- lldb/source/Host/aix/Host.cpp | 56 ++++++++++------------------------- 1 file changed, 15 insertions(+), 41 deletions(-) diff --git a/lldb/source/Host/aix/Host.cpp b/lldb/source/Host/aix/Host.cpp index 6ba3e05348df1..6f2b2ac169cfc 100644 --- a/lldb/source/Host/aix/Host.cpp +++ b/lldb/source/Host/aix/Host.cpp @@ -9,7 +9,6 @@ #include <fcntl.h> #include <sstream> #include <sys/procfs.h> - #include "lldb/Host/Host.h" #include "lldb/Host/linux/Support.h" #include "lldb/Utility/LLDBLog.h" @@ -41,7 +40,6 @@ static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, ProcessState &State, ::pid_t &TracerPid, ::pid_t &Tgid) { Log *log = GetLog(LLDBLog::Host); - auto BufferOrError = getProcFile(Pid, "status"); if (!BufferOrError) return false; @@ -50,7 +48,6 @@ static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, while (!Rest.empty()) { llvm::StringRef Line; std::tie(Line, Rest) = Rest.split('\n'); - if (Line.consume_front("Gid:")) { // Real, effective, saved set, and file system GIDs. Read the first two. Line = Line.ltrim(); @@ -58,7 +55,6 @@ static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, Line.consumeInteger(10, RGid); Line = Line.ltrim(); Line.consumeInteger(10, EGid); - ProcessInfo.SetGroupID(RGid); ProcessInfo.SetEffectiveGroupID(EGid); } else if (Line.consume_front("Uid:")) { @@ -68,7 +64,6 @@ static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, Line.consumeInteger(10, RUid); Line = Line.ltrim(); Line.consumeInteger(10, EUid); - ProcessInfo.SetUserID(RUid); ProcessInfo.SetEffectiveUserID(EUid); } else if (Line.consume_front("PPid:")) { @@ -101,48 +96,28 @@ static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, return true; } -static void GetExePathAndArch(::pid_t pid, ProcessInstanceInfo &process_info) { - Log *log = GetLog(LLDBLog::Process); - std::string ExePath(PATH_MAX, '\0'); +static bool GetExePathAndArch(::pid_t pid, ProcessInstanceInfo &process_info) { struct psinfo psinfoData; - - // We can't use getProcFile here because proc/[pid]/exe is a symbolic link. - llvm::SmallString<64> ProcExe; - (llvm::Twine("/proc/") + llvm::Twine(pid) + "/cwd").toVector(ProcExe); - - ssize_t len = readlink(ProcExe.c_str(), &ExePath[0], PATH_MAX); - if (len > 0) { - ExePath.resize(len); - - struct stat statData; - - std::ostringstream oss; - - oss << "/proc/" << std::dec << pid << "/psinfo"; - assert(stat(oss.str().c_str(), &statData) == 0); - - const int fd = open(oss.str().c_str(), O_RDONLY); - assert(fd >= 0); - - ssize_t readNum = read(fd, &psinfoData, sizeof(psinfoData)); - assert(readNum >= 0); - - close(fd); - } else { - LLDB_LOG(log, "failed to read link exe link for {0}: {1}", pid, - Status(errno, eErrorTypePOSIX)); - ExePath.resize(0); - } - + auto BufferOrError = getProcFile(pid, "psinfo"); + if (!BufferOrError) + return false; + + std::unique_ptr<llvm::MemoryBuffer> PsinfoBuffer = std::move(*BufferOrError); + // Ensure there's enough data for psinfoData + if(PsinfoBuffer->getBufferSize() < sizeof(psinfoData)) + return false; + + std::memcpy(&psinfoData, PsinfoBuffer->getBufferStart(), sizeof(psinfoData)); llvm::StringRef PathRef(&(psinfoData.pr_psargs[0])); - if (!PathRef.empty()) { process_info.GetExecutableFile().SetFile(PathRef, FileSpec::Style::native); ArchSpec arch_spec = ArchSpec(); arch_spec.SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE, llvm::Triple::AIX); process_info.SetArchitecture(arch_spec); + return true; } + return false; } static bool GetProcessAndStatInfo(::pid_t pid, @@ -151,11 +126,10 @@ static bool GetProcessAndStatInfo(::pid_t pid, ::pid_t tgid; tracerpid = 0; process_info.Clear(); - process_info.SetProcessID(pid); - GetExePathAndArch(pid, process_info); - + if(!GetExePathAndArch(pid, process_info)) + return false; // Get User and Group IDs and get tracer pid. if (!GetStatusInfo(pid, process_info, State, tracerpid, tgid)) return false; >From f3edd7ccf2f8a38caad9de8fba0cca734b79acfb Mon Sep 17 00:00:00 2001 From: HemangGadhavi <hemang.gadh...@ibm.com> Date: Thu, 10 Apr 2025 07:12:46 -0500 Subject: [PATCH 3/4] changes as per the clang-format --- lldb/source/Host/aix/Host.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lldb/source/Host/aix/Host.cpp b/lldb/source/Host/aix/Host.cpp index 6f2b2ac169cfc..d1880ff7d1432 100644 --- a/lldb/source/Host/aix/Host.cpp +++ b/lldb/source/Host/aix/Host.cpp @@ -6,9 +6,6 @@ // //===----------------------------------------------------------------------===// -#include <fcntl.h> -#include <sstream> -#include <sys/procfs.h> #include "lldb/Host/Host.h" #include "lldb/Host/linux/Support.h" #include "lldb/Utility/LLDBLog.h" @@ -16,6 +13,7 @@ #include "lldb/Utility/ProcessInfo.h" #include "lldb/Utility/Status.h" #include "llvm/BinaryFormat/XCOFF.h" +#include <sys/procfs.h> using namespace llvm; using namespace lldb; @@ -101,12 +99,12 @@ static bool GetExePathAndArch(::pid_t pid, ProcessInstanceInfo &process_info) { auto BufferOrError = getProcFile(pid, "psinfo"); if (!BufferOrError) return false; - + std::unique_ptr<llvm::MemoryBuffer> PsinfoBuffer = std::move(*BufferOrError); // Ensure there's enough data for psinfoData - if(PsinfoBuffer->getBufferSize() < sizeof(psinfoData)) + if (PsinfoBuffer->getBufferSize() < sizeof(psinfoData)) return false; - + std::memcpy(&psinfoData, PsinfoBuffer->getBufferStart(), sizeof(psinfoData)); llvm::StringRef PathRef(&(psinfoData.pr_psargs[0])); if (!PathRef.empty()) { @@ -128,7 +126,7 @@ static bool GetProcessAndStatInfo(::pid_t pid, process_info.Clear(); process_info.SetProcessID(pid); - if(!GetExePathAndArch(pid, process_info)) + if (!GetExePathAndArch(pid, process_info)) return false; // Get User and Group IDs and get tracer pid. if (!GetStatusInfo(pid, process_info, State, tracerpid, tgid)) >From f434632f089f53eb014027c1da2dd2a0f65218c4 Mon Sep 17 00:00:00 2001 From: HemangGadhavi <hemang.gadh...@ibm.com> Date: Mon, 14 Apr 2025 08:54:43 -0400 Subject: [PATCH 4/4] Moved the host support and unittest functions to posix --- lldb/include/lldb/Host/linux/Support.h | 6 - lldb/include/lldb/Host/posix/Support.h | 26 ++++ lldb/source/Host/CMakeLists.txt | 2 +- lldb/source/Host/aix/Host.cpp | 136 +++++++++--------- lldb/source/Host/linux/Host.cpp | 2 +- lldb/source/Host/linux/Support.cpp | 20 --- lldb/source/Host/posix/Support.cpp | 32 +++++ .../Plugins/Process/AIX/NativeProcessAIX.h | 2 +- .../Process/Linux/IntelPTCollector.cpp | 1 - .../Process/Linux/NativeProcessLinux.h | 1 + lldb/source/Plugins/Process/Linux/Perf.cpp | 1 - lldb/source/Plugins/Process/Linux/Procfs.cpp | 2 +- lldb/unittests/Host/CMakeLists.txt | 6 +- .../Host/{linux => posix}/HostTest.cpp | 5 +- .../Host/{linux => posix}/SupportTest.cpp | 5 +- lldb/unittests/Process/Linux/ProcfsTests.cpp | 2 +- 16 files changed, 139 insertions(+), 110 deletions(-) create mode 100644 lldb/include/lldb/Host/posix/Support.h create mode 100644 lldb/source/Host/posix/Support.cpp rename lldb/unittests/Host/{linux => posix}/HostTest.cpp (98%) rename lldb/unittests/Host/{linux => posix}/SupportTest.cpp (86%) diff --git a/lldb/include/lldb/Host/linux/Support.h b/lldb/include/lldb/Host/linux/Support.h index d1eb7f83d4916..1b8e1e2c26fa7 100644 --- a/lldb/include/lldb/Host/linux/Support.h +++ b/lldb/include/lldb/Host/linux/Support.h @@ -18,12 +18,6 @@ namespace lldb_private { llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> getProcFile(::pid_t pid, ::pid_t tid, const llvm::Twine &file); -llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> -getProcFile(::pid_t pid, const llvm::Twine &file); - -llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> -getProcFile(const llvm::Twine &file); - } // namespace lldb_private #endif // #ifndef LLDB_HOST_LINUX_SUPPORT_H diff --git a/lldb/include/lldb/Host/posix/Support.h b/lldb/include/lldb/Host/posix/Support.h new file mode 100644 index 0000000000000..c4de260acb26d --- /dev/null +++ b/lldb/include/lldb/Host/posix/Support.h @@ -0,0 +1,26 @@ +//===-- Support.h -----------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_HOST_POSIX_SUPPORT_H +#define LLDB_HOST_POSIX_SUPPORT_H + +#include "llvm/Support/ErrorOr.h" +#include "llvm/Support/MemoryBuffer.h" +#include <memory> + +namespace lldb_private { + +llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> +getProcFile(::pid_t pid, const llvm::Twine &file); + +llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> +getProcFile(const llvm::Twine &file); + +} // namespace lldb_private + +#endif // #ifndef LLDB_HOST_POSIX_SUPPORT_H diff --git a/lldb/source/Host/CMakeLists.txt b/lldb/source/Host/CMakeLists.txt index a02b1c104396e..90814b1bed4c8 100644 --- a/lldb/source/Host/CMakeLists.txt +++ b/lldb/source/Host/CMakeLists.txt @@ -87,6 +87,7 @@ else() posix/MainLoopPosix.cpp posix/PipePosix.cpp posix/ProcessLauncherPosixFork.cpp + posix/Support.cpp ) if (CMAKE_SYSTEM_NAME MATCHES "Darwin") @@ -141,7 +142,6 @@ else() add_host_subdirectory(aix aix/Host.cpp aix/HostInfoAIX.cpp - linux/Support.cpp ) endif() endif() diff --git a/lldb/source/Host/aix/Host.cpp b/lldb/source/Host/aix/Host.cpp index d1880ff7d1432..6f59cb6e1f281 100644 --- a/lldb/source/Host/aix/Host.cpp +++ b/lldb/source/Host/aix/Host.cpp @@ -7,12 +7,13 @@ //===----------------------------------------------------------------------===// #include "lldb/Host/Host.h" -#include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/ProcessInfo.h" #include "lldb/Utility/Status.h" #include "llvm/BinaryFormat/XCOFF.h" +#include <sys/proc.h> #include <sys/procfs.h> using namespace llvm; @@ -34,67 +35,53 @@ enum class ProcessState { }; } -static bool GetStatusInfo(::pid_t Pid, ProcessInstanceInfo &ProcessInfo, - ProcessState &State, ::pid_t &TracerPid, - ::pid_t &Tgid) { - Log *log = GetLog(LLDBLog::Host); - auto BufferOrError = getProcFile(Pid, "status"); +ProcessInstanceInfo::timespec convert(pr_timestruc64_t t) { + ProcessInstanceInfo::timespec ts; + ts.tv_sec = t.tv_sec; + ts.tv_usec = t.tv_nsec / 1000; // nanos to micros + return ts; +} + +static bool GetStatusInfo(::pid_t pid, ProcessInstanceInfo &processInfo, + ProcessState &State) { + struct pstatus pstatusData; + auto BufferOrError = getProcFile(pid, "status"); if (!BufferOrError) return false; - llvm::StringRef Rest = BufferOrError.get()->getBuffer(); - while (!Rest.empty()) { - llvm::StringRef Line; - std::tie(Line, Rest) = Rest.split('\n'); - if (Line.consume_front("Gid:")) { - // Real, effective, saved set, and file system GIDs. Read the first two. - Line = Line.ltrim(); - uint32_t RGid, EGid; - Line.consumeInteger(10, RGid); - Line = Line.ltrim(); - Line.consumeInteger(10, EGid); - ProcessInfo.SetGroupID(RGid); - ProcessInfo.SetEffectiveGroupID(EGid); - } else if (Line.consume_front("Uid:")) { - // Real, effective, saved set, and file system UIDs. Read the first two. - Line = Line.ltrim(); - uint32_t RUid, EUid; - Line.consumeInteger(10, RUid); - Line = Line.ltrim(); - Line.consumeInteger(10, EUid); - ProcessInfo.SetUserID(RUid); - ProcessInfo.SetEffectiveUserID(EUid); - } else if (Line.consume_front("PPid:")) { - ::pid_t PPid; - Line.ltrim().consumeInteger(10, PPid); - ProcessInfo.SetParentProcessID(PPid); - } else if (Line.consume_front("State:")) { - State = llvm::StringSwitch<ProcessState>(Line.ltrim().take_front(1)) - .Case("D", ProcessState::DiskSleep) - .Case("I", ProcessState::Idle) - .Case("R", ProcessState::Running) - .Case("S", ProcessState::Sleeping) - .CaseLower("T", ProcessState::TracedOrStopped) - .Case("W", ProcessState::Paging) - .Case("P", ProcessState::Parked) - .Case("X", ProcessState::Dead) - .Case("Z", ProcessState::Zombie) - .Default(ProcessState::Unknown); - if (State == ProcessState::Unknown) { - LLDB_LOG(log, "Unknown process state {0}", Line); - } - } else if (Line.consume_front("TracerPid:")) { - Line = Line.ltrim(); - Line.consumeInteger(10, TracerPid); - } else if (Line.consume_front("Tgid:")) { - Line = Line.ltrim(); - Line.consumeInteger(10, Tgid); - } + std::unique_ptr<llvm::MemoryBuffer> StatusBuffer = std::move(*BufferOrError); + // Ensure there's enough data for psinfoData + if (StatusBuffer->getBufferSize() < sizeof(pstatusData)) + return false; + + std::memcpy(&pstatusData, StatusBuffer->getBufferStart(), + sizeof(pstatusData)); + switch (pstatusData.pr_stat) { + case SIDL: + State = ProcessState::Idle; + break; + case SACTIVE: + State = ProcessState::Running; + break; + case SSTOP: + State = ProcessState::TracedOrStopped; + break; + case SZOMB: + State = ProcessState::Zombie; + break; + default: + State = ProcessState::Unknown; + break; } + processInfo.SetIsZombie(State == ProcessState::Zombie); + processInfo.SetUserTime(convert(pstatusData.pr_utime)); + processInfo.SetSystemTime(convert(pstatusData.pr_stime)); + processInfo.SetCumulativeUserTime(convert(pstatusData.pr_cutime)); + processInfo.SetCumulativeSystemTime(convert(pstatusData.pr_cstime)); return true; } -static bool GetExePathAndArch(::pid_t pid, ProcessInstanceInfo &process_info) { +static bool GetExePathAndIds(::pid_t pid, ProcessInstanceInfo &process_info) { struct psinfo psinfoData; auto BufferOrError = getProcFile(pid, "psinfo"); if (!BufferOrError) @@ -107,29 +94,35 @@ static bool GetExePathAndArch(::pid_t pid, ProcessInstanceInfo &process_info) { std::memcpy(&psinfoData, PsinfoBuffer->getBufferStart(), sizeof(psinfoData)); llvm::StringRef PathRef(&(psinfoData.pr_psargs[0])); - if (!PathRef.empty()) { - process_info.GetExecutableFile().SetFile(PathRef, FileSpec::Style::native); - ArchSpec arch_spec = ArchSpec(); - arch_spec.SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64, - LLDB_INVALID_CPUTYPE, llvm::Triple::AIX); - process_info.SetArchitecture(arch_spec); - return true; - } - return false; + if (PathRef.empty()) + return false; + + process_info.GetExecutableFile().SetFile(PathRef, FileSpec::Style::native); + ArchSpec arch_spec = ArchSpec(); + arch_spec.SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64, + LLDB_INVALID_CPUTYPE, llvm::Triple::AIX); + process_info.SetArchitecture(arch_spec); + process_info.SetParentProcessID(psinfoData.pr_ppid); + process_info.SetGroupID(psinfoData.pr_gid); + process_info.SetEffectiveGroupID(psinfoData.pr_egid); + process_info.SetUserID(psinfoData.pr_uid); + process_info.SetEffectiveUserID(psinfoData.pr_euid); + process_info.SetProcessGroupID(psinfoData.pr_pgid); + process_info.SetProcessSessionID(psinfoData.pr_sid); + return true; } static bool GetProcessAndStatInfo(::pid_t pid, ProcessInstanceInfo &process_info, - ProcessState &State, ::pid_t &tracerpid) { - ::pid_t tgid; - tracerpid = 0; + ProcessState &State) { process_info.Clear(); process_info.SetProcessID(pid); - if (!GetExePathAndArch(pid, process_info)) + // Get Executable path/Arch and Get User and Group IDs. + if (!GetExePathAndIds(pid, process_info)) return false; - // Get User and Group IDs and get tracer pid. - if (!GetStatusInfo(pid, process_info, State, tracerpid, tgid)) + // Get process status and timing info. + if (!GetStatusInfo(pid, process_info, State)) return false; return true; @@ -141,9 +134,8 @@ uint32_t Host::FindProcessesImpl(const ProcessInstanceInfoMatch &match_info, } bool Host::GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &process_info) { - ::pid_t tracerpid; ProcessState State; - return GetProcessAndStatInfo(pid, process_info, State, tracerpid); + return GetProcessAndStatInfo(pid, process_info, State); } Status Host::ShellExpandArguments(ProcessLaunchInfo &launch_info) { diff --git a/lldb/source/Host/linux/Host.cpp b/lldb/source/Host/linux/Host.cpp index 25bef9b0e7151..8b475a7ab5003 100644 --- a/lldb/source/Host/linux/Host.cpp +++ b/lldb/source/Host/linux/Host.cpp @@ -30,7 +30,7 @@ #include "lldb/Host/Host.h" #include "lldb/Host/HostInfo.h" #include "lldb/Host/linux/Host.h" -#include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "lldb/Utility/DataExtractor.h" using namespace lldb; diff --git a/lldb/source/Host/linux/Support.cpp b/lldb/source/Host/linux/Support.cpp index 8b0decc48c038..c6321e93f4dfa 100644 --- a/lldb/source/Host/linux/Support.cpp +++ b/lldb/source/Host/linux/Support.cpp @@ -22,23 +22,3 @@ lldb_private::getProcFile(::pid_t pid, ::pid_t tid, const llvm::Twine &file) { LLDB_LOG(log, "Failed to open {0}: {1}", File, Ret.getError().message()); return Ret; } - -llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> -lldb_private::getProcFile(::pid_t pid, const llvm::Twine &file) { - Log *log = GetLog(LLDBLog::Host); - std::string File = ("/proc/" + llvm::Twine(pid) + "/" + file).str(); - auto Ret = llvm::MemoryBuffer::getFileAsStream(File); - if (!Ret) - LLDB_LOG(log, "Failed to open {0}: {1}", File, Ret.getError().message()); - return Ret; -} - -llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> -lldb_private::getProcFile(const llvm::Twine &file) { - Log *log = GetLog(LLDBLog::Host); - std::string File = ("/proc/" + file).str(); - auto Ret = llvm::MemoryBuffer::getFileAsStream(File); - if (!Ret) - LLDB_LOG(log, "Failed to open {0}: {1}", File, Ret.getError().message()); - return Ret; -} diff --git a/lldb/source/Host/posix/Support.cpp b/lldb/source/Host/posix/Support.cpp new file mode 100644 index 0000000000000..abfcc8ddb2d7f --- /dev/null +++ b/lldb/source/Host/posix/Support.cpp @@ -0,0 +1,32 @@ +//===-- Support.cpp -------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/posix/Support.h" +#include "lldb/Utility/LLDBLog.h" +#include "lldb/Utility/Log.h" +#include "llvm/Support/MemoryBuffer.h" + +llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> +lldb_private::getProcFile(::pid_t pid, const llvm::Twine &file) { + Log *log = GetLog(LLDBLog::Host); + std::string File = ("/proc/" + llvm::Twine(pid) + "/" + file).str(); + auto Ret = llvm::MemoryBuffer::getFileAsStream(File); + if (!Ret) + LLDB_LOG(log, "Failed to open {0}: {1}", File, Ret.getError().message()); + return Ret; +} + +llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> +lldb_private::getProcFile(const llvm::Twine &file) { + Log *log = GetLog(LLDBLog::Host); + std::string File = ("/proc/" + file).str(); + auto Ret = llvm::MemoryBuffer::getFileAsStream(File); + if (!Ret) + LLDB_LOG(log, "Failed to open {0}: {1}", File, Ret.getError().message()); + return Ret; +} diff --git a/lldb/source/Plugins/Process/AIX/NativeProcessAIX.h b/lldb/source/Plugins/Process/AIX/NativeProcessAIX.h index 0fd7ff2785123..bc44f2b02af98 100644 --- a/lldb/source/Plugins/Process/AIX/NativeProcessAIX.h +++ b/lldb/source/Plugins/Process/AIX/NativeProcessAIX.h @@ -12,7 +12,7 @@ #include "Plugins/Process/Utility/NativeProcessSoftwareSingleStep.h" #include "lldb/Host/Debug.h" #include "lldb/Host/common/NativeProcessProtocol.h" -#include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "lldb/Target/MemoryRegionInfo.h" #include "lldb/Utility/ArchSpec.h" #include "lldb/Utility/FileSpec.h" diff --git a/lldb/source/Plugins/Process/Linux/IntelPTCollector.cpp b/lldb/source/Plugins/Process/Linux/IntelPTCollector.cpp index a38b75c9e615f..06551a4ff5a00 100644 --- a/lldb/source/Plugins/Process/Linux/IntelPTCollector.cpp +++ b/lldb/source/Plugins/Process/Linux/IntelPTCollector.cpp @@ -10,7 +10,6 @@ #include "Perf.h" #include "Plugins/Process/POSIX/ProcessPOSIXLog.h" #include "Procfs.h" -#include "lldb/Host/linux/Support.h" #include "lldb/Utility/StreamString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" diff --git a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.h b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.h index 2af6c646332c9..d345f165a75d8 100644 --- a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.h +++ b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.h @@ -15,6 +15,7 @@ #include "lldb/Host/Debug.h" #include "lldb/Host/HostThread.h" #include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "lldb/Target/MemoryRegionInfo.h" #include "lldb/Utility/ArchSpec.h" #include "lldb/Utility/FileSpec.h" diff --git a/lldb/source/Plugins/Process/Linux/Perf.cpp b/lldb/source/Plugins/Process/Linux/Perf.cpp index 097c719b9c1d2..4207364812110 100644 --- a/lldb/source/Plugins/Process/Linux/Perf.cpp +++ b/lldb/source/Plugins/Process/Linux/Perf.cpp @@ -9,7 +9,6 @@ #include "Perf.h" #include "Plugins/Process/POSIX/ProcessPOSIXLog.h" -#include "lldb/Host/linux/Support.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/MemoryBuffer.h" diff --git a/lldb/source/Plugins/Process/Linux/Procfs.cpp b/lldb/source/Plugins/Process/Linux/Procfs.cpp index 8c279c7ab6533..d3bd396fbaeab 100644 --- a/lldb/source/Plugins/Process/Linux/Procfs.cpp +++ b/lldb/source/Plugins/Process/Linux/Procfs.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// #include "Procfs.h" -#include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Error.h" #include "llvm/Support/MemoryBuffer.h" diff --git a/lldb/unittests/Host/CMakeLists.txt b/lldb/unittests/Host/CMakeLists.txt index c959478970d18..1c44de40d5798 100644 --- a/lldb/unittests/Host/CMakeLists.txt +++ b/lldb/unittests/Host/CMakeLists.txt @@ -15,10 +15,10 @@ set (FILES XMLTest.cpp ) -if (CMAKE_SYSTEM_NAME MATCHES "Linux|Android") +if (CMAKE_SYSTEM_NAME MATCHES "Linux|Android|AIX") list(APPEND FILES - linux/HostTest.cpp - linux/SupportTest.cpp + posix/HostTest.cpp + posix/SupportTest.cpp ) endif() diff --git a/lldb/unittests/Host/linux/HostTest.cpp b/lldb/unittests/Host/posix/HostTest.cpp similarity index 98% rename from lldb/unittests/Host/linux/HostTest.cpp rename to lldb/unittests/Host/posix/HostTest.cpp index d6aefcc7faa25..a581be960ad51 100644 --- a/lldb/unittests/Host/linux/HostTest.cpp +++ b/lldb/unittests/Host/posix/HostTest.cpp @@ -40,8 +40,9 @@ TEST_F(HostTest, GetProcessInfo) { triple.getEnvironment() == llvm::Triple::EnvironmentType::Android)); ProcessInstanceInfo Info; +#ifndef _AIX ASSERT_FALSE(Host::GetProcessInfo(0, Info)); - +#endif /* ifndef _AIX */ ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info)); ASSERT_TRUE(Info.ProcessIDIsValid()); @@ -90,6 +91,7 @@ TEST_F(HostTest, GetProcessInfo) { ASSERT_TRUE(user_time.tv_sec <= next_user_time.tv_sec || user_time.tv_usec <= next_user_time.tv_usec); +#ifndef _AIX struct rlimit rlim; EXPECT_EQ(getrlimit(RLIMIT_NICE, &rlim), 0); // getpriority can return -1 so we zero errno first @@ -108,4 +110,5 @@ TEST_F(HostTest, GetProcessInfo) { } ASSERT_TRUE(Info.IsZombie().has_value()); ASSERT_FALSE(Info.IsZombie().value()); +#endif /* ifndef _AIX */ } diff --git a/lldb/unittests/Host/linux/SupportTest.cpp b/lldb/unittests/Host/posix/SupportTest.cpp similarity index 86% rename from lldb/unittests/Host/linux/SupportTest.cpp rename to lldb/unittests/Host/posix/SupportTest.cpp index 6d1d28cd4caad..9cb364d1ee4ae 100644 --- a/lldb/unittests/Host/linux/SupportTest.cpp +++ b/lldb/unittests/Host/posix/SupportTest.cpp @@ -7,17 +7,19 @@ //===----------------------------------------------------------------------===// #include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "llvm/Support/Threading.h" #include "gtest/gtest.h" using namespace lldb_private; TEST(Support, getProcFile_Pid) { - auto BufferOrError = getProcFile(getpid(), "maps"); + auto BufferOrError = getProcFile(getpid(), "status"); ASSERT_TRUE(BufferOrError); ASSERT_TRUE(*BufferOrError); } +#ifndef _AIX #ifdef LLVM_ENABLE_THREADING TEST(Support, getProcFile_Tid) { auto BufferOrError = getProcFile(getpid(), llvm::get_threadid(), "comm"); @@ -25,3 +27,4 @@ TEST(Support, getProcFile_Tid) { ASSERT_TRUE(*BufferOrError); } #endif /*ifdef LLVM_ENABLE_THREADING */ +#endif /*ifndef _AIX */ diff --git a/lldb/unittests/Process/Linux/ProcfsTests.cpp b/lldb/unittests/Process/Linux/ProcfsTests.cpp index d95de649ed578..e050db25b2ed4 100644 --- a/lldb/unittests/Process/Linux/ProcfsTests.cpp +++ b/lldb/unittests/Process/Linux/ProcfsTests.cpp @@ -8,7 +8,7 @@ #include "Procfs.h" -#include "lldb/Host/linux/Support.h" +#include "lldb/Host/posix/Support.h" #include "gmock/gmock.h" #include "gtest/gtest.h" _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits