Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions lldb/source/Plugins/Platform/AIX/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
add_definitions("-D_ALL_SOURCE")
Copy link
Collaborator

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?

Copy link
Member Author

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_ANONYMOUS

Copy link
Collaborator

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:

target_compile_definitions(lldbPluginPlatformAIX PRIVATE "-D_ALL_SOURCE")

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, Thanks!


add_lldb_library(lldbPluginPlatformAIX PLUGIN
PlatformAIX.cpp

LINK_LIBS
lldbBreakpoint
lldbCore
lldbHost
lldbInterpreter
lldbTarget
lldbPluginPlatformPOSIX
)
155 changes: 155 additions & 0 deletions lldb/source/Plugins/Platform/AIX/PlatformAIX.cpp
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;
#if defined(_AIX)
flags_platform = MapPrivate | MapVariable | MapAnon;
#endif
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this actually be translating the lldb generic flags into the platform-specific ones, like e.g. the linux code does:

  if (flags & eMmapFlagsPrivate)
    flags_platform |= MapPrivate;
  if (flags & eMmapFlagsAnon)
    flags_platform |= MapAnon;

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ohh, yes I will do that, but should I still keep the _AIX flag or not? based on the remote debugging conversation?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, drop the ifdef. Thanks.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hope I have covered everything and its okay now?

MmapArgList args({addr, length, prot, flags_platform, fd, offset});
return args;
}

CompilerType PlatformAIX::GetSiginfoType(const llvm::Triple &triple) {
return CompilerType();
}
70 changes: 70 additions & 0 deletions lldb/source/Plugins/Platform/AIX/PlatformAIX.h
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 {

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
1 change: 1 addition & 0 deletions lldb/source/Plugins/Platform/CMakeLists.txt
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)
Expand Down