-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[lldb][AIX] Added PlatformAIX plugin #121273
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
16107a4
3e2adb9
ca9901a
d9f7291
5331ca3
54899c2
7c1d762
b19beed
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| add_definitions("-D_ALL_SOURCE") | ||
|
|
||
| add_lldb_library(lldbPluginPlatformAIX PLUGIN | ||
| PlatformAIX.cpp | ||
|
|
||
| LINK_LIBS | ||
| lldbBreakpoint | ||
| lldbCore | ||
| lldbHost | ||
| lldbInterpreter | ||
| lldbTarget | ||
| lldbPluginPlatformPOSIX | ||
| ) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,155 @@ | ||
| //===-- PlatformAIX.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 "PlatformAIX.h" | ||
| #include "lldb/Host/Config.h" | ||
| #include <cstdio> | ||
| #if LLDB_ENABLE_POSIX | ||
| #include <sys/utsname.h> | ||
| #endif | ||
| #include "Utility/ARM64_DWARF_Registers.h" | ||
| #include "lldb/Core/Debugger.h" | ||
| #include "lldb/Core/PluginManager.h" | ||
| #include "lldb/Host/HostInfo.h" | ||
| #include "lldb/Symbol/UnwindPlan.h" | ||
| #include "lldb/Target/Process.h" | ||
| #include "lldb/Target/Target.h" | ||
| #include "lldb/Utility/FileSpec.h" | ||
| #include "lldb/Utility/LLDBLog.h" | ||
| #include "lldb/Utility/Log.h" | ||
| #include "lldb/Utility/State.h" | ||
| #include "lldb/Utility/Status.h" | ||
| #include "lldb/Utility/StreamString.h" | ||
|
|
||
| // Use defined constants from AIX mman.h for use when targeting remote aix | ||
| // systems even when host has different values. | ||
|
|
||
| // For remotely cross debugging aix | ||
| constexpr int MapVariable = 0x0; | ||
| constexpr int MapPrivate = 0x2; | ||
| constexpr int MapAnonymous = 0x10; | ||
| #if defined(_AIX) | ||
| #include <sys/mman.h> | ||
| static_assert(MapVariable == MAP_VARIABLE); | ||
| static_assert(MapPrivate == MAP_PRIVATE); | ||
| static_assert(MapAnonymous = MAP_ANONYMOUS); | ||
| #endif | ||
|
|
||
| using namespace lldb; | ||
| using namespace lldb_private; | ||
| using namespace lldb_private::platform_aix; | ||
|
|
||
| LLDB_PLUGIN_DEFINE(PlatformAIX) | ||
|
|
||
| static uint32_t g_initialize_count = 0; | ||
|
|
||
| PlatformSP PlatformAIX::CreateInstance(bool force, const ArchSpec *arch) { | ||
| Log *log = GetLog(LLDBLog::Platform); | ||
| LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force, | ||
| arch ? arch->GetArchitectureName() : "<null>", | ||
| arch ? arch->GetTriple().getTriple() : "<null>"); | ||
|
|
||
| bool create = force || (arch && arch->IsValid() && | ||
| arch->GetTriple().getOS() == llvm::Triple::AIX); | ||
| LLDB_LOG(log, "create = {0}", create); | ||
| if (create) { | ||
| return PlatformSP(new PlatformAIX(false)); | ||
| } | ||
| return PlatformSP(); | ||
| } | ||
|
|
||
| llvm::StringRef PlatformAIX::GetPluginDescriptionStatic(bool is_host) { | ||
| if (is_host) | ||
| return "Local AIX user platform plug-in."; | ||
| return "Remote AIX user platform plug-in."; | ||
| } | ||
|
|
||
| void PlatformAIX::Initialize() { | ||
| PlatformPOSIX::Initialize(); | ||
|
|
||
| if (g_initialize_count++ == 0) { | ||
| #ifdef _AIX | ||
| PlatformSP default_platform_sp(new PlatformAIX(true)); | ||
| default_platform_sp->SetSystemArchitecture(HostInfo::GetArchitecture()); | ||
| Platform::SetHostPlatform(default_platform_sp); | ||
| #endif | ||
| PluginManager::RegisterPlugin( | ||
| PlatformAIX::GetPluginNameStatic(false), | ||
| PlatformAIX::GetPluginDescriptionStatic(false), | ||
| PlatformAIX::CreateInstance, nullptr); | ||
| } | ||
| } | ||
|
|
||
| void PlatformAIX::Terminate() { | ||
| if (g_initialize_count > 0) | ||
| if (--g_initialize_count == 0) | ||
| PluginManager::UnregisterPlugin(PlatformAIX::CreateInstance); | ||
|
|
||
| PlatformPOSIX::Terminate(); | ||
| } | ||
|
|
||
| PlatformAIX::PlatformAIX(bool is_host) : PlatformPOSIX(is_host) { | ||
| if (is_host) { | ||
| ArchSpec hostArch = HostInfo::GetArchitecture(HostInfo::eArchKindDefault); | ||
| m_supported_architectures.push_back(hostArch); | ||
| } else { | ||
| m_supported_architectures = | ||
| CreateArchList({llvm::Triple::ppc64}, llvm::Triple::AIX); | ||
| } | ||
| } | ||
|
|
||
| std::vector<ArchSpec> | ||
| PlatformAIX::GetSupportedArchitectures(const ArchSpec &process_host_arch) { | ||
| if (m_remote_platform_sp) | ||
| return m_remote_platform_sp->GetSupportedArchitectures(process_host_arch); | ||
| return m_supported_architectures; | ||
| } | ||
|
|
||
| void PlatformAIX::GetStatus(Stream &strm) { | ||
| Platform::GetStatus(strm); | ||
|
|
||
| #if LLDB_ENABLE_POSIX | ||
| // Display local kernel information only when we are running in host mode. | ||
| // Otherwise, we would end up printing non-AIX information (when running on | ||
| // Mac OS for example). | ||
| if (IsHost()) { | ||
| struct utsname un; | ||
|
|
||
| if (uname(&un)) | ||
| return; | ||
|
|
||
| strm.Printf(" Kernel: %s\n", un.sysname); | ||
| strm.Printf(" Release: %s\n", un.release); | ||
| strm.Printf(" Version: %s\n", un.version); | ||
| } | ||
| #endif | ||
| } | ||
|
|
||
| void PlatformAIX::CalculateTrapHandlerSymbolNames() {} | ||
|
|
||
| lldb::UnwindPlanSP | ||
| PlatformAIX::GetTrapHandlerUnwindPlan(const llvm::Triple &triple, | ||
| ConstString name) { | ||
| return {}; | ||
| } | ||
|
|
||
| MmapArgList PlatformAIX::GetMmapArgumentList(const ArchSpec &arch, addr_t addr, | ||
| addr_t length, unsigned prot, | ||
| unsigned flags, addr_t fd, | ||
| addr_t offset) { | ||
| unsigned flags_platform = 0; | ||
DhruvSrivastavaX marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| #if defined(_AIX) | ||
| flags_platform = MapPrivate | MapVariable | MapAnon; | ||
| #endif | ||
|
||
| MmapArgList args({addr, length, prot, flags_platform, fd, offset}); | ||
| return args; | ||
| } | ||
|
|
||
| CompilerType PlatformAIX::GetSiginfoType(const llvm::Triple &triple) { | ||
| return CompilerType(); | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| //===-- PlatformAIX.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_SOURCE_PLUGINS_PLATFORM_AIX_PLATFORMAIX_H | ||
| #define LLDB_SOURCE_PLUGINS_PLATFORM_AIX_PLATFORMAIX_H | ||
|
|
||
| #include "Plugins/Platform/POSIX/PlatformPOSIX.h" | ||
| #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" | ||
|
|
||
| namespace lldb_private { | ||
| namespace platform_aix { | ||
DhruvSrivastavaX marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| class PlatformAIX : public PlatformPOSIX { | ||
| public: | ||
| PlatformAIX(bool is_host); | ||
|
|
||
| static void Initialize(); | ||
|
|
||
| static void Terminate(); | ||
|
|
||
| // lldb_private::PluginInterface functions | ||
| static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch); | ||
|
|
||
| static llvm::StringRef GetPluginNameStatic(bool is_host) { | ||
| return is_host ? Platform::GetHostPlatformName() : "remote-AIX"; | ||
| } | ||
|
|
||
| static llvm::StringRef GetPluginDescriptionStatic(bool is_host); | ||
|
|
||
| llvm::StringRef GetPluginName() override { | ||
| return GetPluginNameStatic(IsHost()); | ||
| } | ||
|
|
||
| // lldb_private::Platform functions | ||
| llvm::StringRef GetDescription() override { | ||
| return GetPluginDescriptionStatic(IsHost()); | ||
| } | ||
|
|
||
| void GetStatus(Stream &strm) override; | ||
|
|
||
| std::vector<ArchSpec> | ||
| GetSupportedArchitectures(const ArchSpec &process_host_arch) override; | ||
|
|
||
| void CalculateTrapHandlerSymbolNames() override; | ||
|
|
||
| lldb::UnwindPlanSP GetTrapHandlerUnwindPlan(const llvm::Triple &triple, | ||
| ConstString name) override; | ||
|
|
||
| MmapArgList GetMmapArgumentList(const ArchSpec &arch, lldb::addr_t addr, | ||
| lldb::addr_t length, unsigned prot, | ||
| unsigned flags, lldb::addr_t fd, | ||
| lldb::addr_t offset) override; | ||
|
|
||
| CompilerType GetSiginfoType(const llvm::Triple &triple) override; | ||
|
|
||
| std::vector<ArchSpec> m_supported_architectures; | ||
|
|
||
| private: | ||
| std::unique_ptr<TypeSystemClang> m_type_system_up; | ||
| }; | ||
|
|
||
| } // namespace platform_aix | ||
| } // namespace lldb_private | ||
|
|
||
| #endif // LLDB_SOURCE_PLUGINS_PLATFORM_AIX_PLATFORMAIX_H | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,4 @@ | ||
| add_subdirectory(AIX) | ||
| add_subdirectory(Android) | ||
| add_subdirectory(FreeBSD) | ||
| add_subdirectory(gdb-server) | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remind me please, what symbol is this needed for?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For this plugin, it is there for
MAP_ANONYMOUSThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, that makes sense. I'd just suggest using the slightly newer form:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done, Thanks!