[Lldb-commits] [lldb] 46c2e4c - Refactor ObjectFilePlaceholder for sharing
Jeffrey Tan via lldb-commits
lldb-commits at lists.llvm.org
Mon Mar 13 11:09:26 PDT 2023
Author: Jeffrey Tan
Date: 2023-03-13T11:09:05-07:00
New Revision: 46c2e4c4f347038179e21e027128f5f2914fb980
URL: https://github.com/llvm/llvm-project/commit/46c2e4c4f347038179e21e027128f5f2914fb980
DIFF: https://github.com/llvm/llvm-project/commit/46c2e4c4f347038179e21e027128f5f2914fb980.diff
LOG: Refactor ObjectFilePlaceholder for sharing
This patch refactors PlaceholderObjectFile into ObjectFile plugin directory
so that we can reuse it for other cases like coredump debugging with NT_FILE
notes.
PlaceholderObjectFile is also renamed to ObjectFilePlaceholder to be consistent
with ObjectFile plugin naming convention.
Differential Revision: https://reviews.llvm.org/D145955
Added:
lldb/source/Plugins/ObjectFile/Placeholder/CMakeLists.txt
lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.cpp
lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.h
Modified:
lldb/source/Plugins/ObjectFile/CMakeLists.txt
lldb/source/Plugins/Process/minidump/CMakeLists.txt
lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/ObjectFile/CMakeLists.txt b/lldb/source/Plugins/ObjectFile/CMakeLists.txt
index 5cc1240e0768b..6b5ec86399117 100644
--- a/lldb/source/Plugins/ObjectFile/CMakeLists.txt
+++ b/lldb/source/Plugins/ObjectFile/CMakeLists.txt
@@ -6,4 +6,5 @@ add_subdirectory(Mach-O)
add_subdirectory(Minidump)
add_subdirectory(PDB)
add_subdirectory(PECOFF)
+add_subdirectory(Placeholder)
add_subdirectory(wasm)
diff --git a/lldb/source/Plugins/ObjectFile/Placeholder/CMakeLists.txt b/lldb/source/Plugins/ObjectFile/Placeholder/CMakeLists.txt
new file mode 100644
index 0000000000000..d7f8762581016
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/Placeholder/CMakeLists.txt
@@ -0,0 +1,12 @@
+add_lldb_library(lldbPluginObjectFilePlaceholder PLUGIN
+ ObjectFilePlaceholder.cpp
+
+ LINK_LIBS
+ lldbCore
+ lldbHost
+ lldbSymbol
+ lldbTarget
+ LINK_COMPONENTS
+ Object
+ Support
+ )
diff --git a/lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.cpp b/lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.cpp
new file mode 100644
index 0000000000000..ec1f3f61892d3
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.cpp
@@ -0,0 +1,70 @@
+//===-- ObjectFilePlaceholder.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 "ObjectFilePlaceholder.h"
+
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Section.h"
+#include "lldb/Target/SectionLoadList.h"
+#include "lldb/Target/Target.h"
+
+#include <memory>
+
+using namespace lldb;
+using namespace lldb_private;
+
+LLDB_PLUGIN_DEFINE(ObjectFilePlaceholder)
+
+ObjectFilePlaceholder::ObjectFilePlaceholder(
+ const lldb::ModuleSP &module_sp,
+ const lldb_private::ModuleSpec &module_spec, lldb::addr_t base,
+ lldb::addr_t size)
+ : ObjectFile(module_sp, &module_spec.GetFileSpec(), /*file_offset*/ 0,
+ /*length*/ 0, /*data_sp*/ nullptr, /*data_offset*/ 0),
+ m_arch(module_spec.GetArchitecture()), m_uuid(module_spec.GetUUID()),
+ m_base(base), m_size(size) {
+ m_symtab_up = std::make_unique<lldb_private::Symtab>(this);
+}
+
+void ObjectFilePlaceholder::CreateSections(
+ lldb_private::SectionList &unified_section_list) {
+ m_sections_up = std::make_unique<lldb_private::SectionList>();
+ auto section_sp = std::make_shared<lldb_private::Section>(
+ GetModule(), this, /*sect_id*/ 0,
+ lldb_private::ConstString(".module_image"), eSectionTypeOther, m_base,
+ m_size, /*file_offset*/ 0, /*file_size*/ 0,
+ /*log2align*/ 0, /*flags*/ 0);
+ section_sp->SetPermissions(ePermissionsReadable | ePermissionsExecutable);
+ m_sections_up->AddSection(section_sp);
+ unified_section_list.AddSection(std::move(section_sp));
+}
+
+lldb_private::Address ObjectFilePlaceholder::GetBaseAddress() {
+ return lldb_private::Address(m_sections_up->GetSectionAtIndex(0), 0);
+}
+
+bool ObjectFilePlaceholder::SetLoadAddress(Target &target, addr_t value,
+ bool value_is_offset) {
+ assert(!value_is_offset);
+ assert(value == m_base);
+
+ // Create sections if they haven't been created already.
+ GetModule()->GetSectionList();
+ assert(m_sections_up->GetNumSections(0) == 1);
+
+ target.GetSectionLoadList().SetSectionLoadAddress(
+ m_sections_up->GetSectionAtIndex(0), m_base);
+ return true;
+}
+
+void ObjectFilePlaceholder::Dump(lldb_private::Stream *s) {
+ s->Format("Placeholder object file for {0} loaded at [{1:x}-{2:x})\n",
+ GetFileSpec(), m_base, m_base + m_size);
+}
diff --git a/lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.h b/lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.h
new file mode 100644
index 0000000000000..8798bcc5259ee
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.h
@@ -0,0 +1,74 @@
+//===-- ObjectFilePlaceholder.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_OBJECTFILE_PLACEHOLDER_OBJECTFILEPLACEHOLDER_H
+#define LLDB_SOURCE_PLUGINS_OBJECTFILE_PLACEHOLDER_OBJECTFILEPLACEHOLDER_H
+
+#include "lldb/Symbol/ObjectFile.h"
+
+#include "lldb/Target/Target.h"
+#include "lldb/Utility/ArchSpec.h"
+#include "lldb/Utility/FileSpec.h"
+#include "lldb/Utility/UUID.h"
+#include "lldb/lldb-private.h"
+
+/// A minimal ObjectFile implementation providing a dummy object file for the
+/// cases when the real module binary is not available. This allows the module
+/// to show up in "image list" and symbols to be added to it.
+class ObjectFilePlaceholder : public lldb_private::ObjectFile {
+public:
+ // Static Functions
+ static void Initialize() {}
+
+ static void Terminate() {}
+
+ static llvm::StringRef GetPluginNameStatic() { return "placeholder"; }
+
+ ObjectFilePlaceholder(const lldb::ModuleSP &module_sp,
+ const lldb_private::ModuleSpec &module_spec,
+ lldb::addr_t base, lldb::addr_t size);
+
+ llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
+ bool ParseHeader() override { return true; }
+ Type CalculateType() override { return eTypeUnknown; }
+ Strata CalculateStrata() override { return eStrataUnknown; }
+ uint32_t GetDependentModules(lldb_private::FileSpecList &file_list) override {
+ return 0;
+ }
+ bool IsExecutable() const override { return false; }
+ lldb_private::ArchSpec GetArchitecture() override { return m_arch; }
+ lldb_private::UUID GetUUID() override { return m_uuid; }
+ void ParseSymtab(lldb_private::Symtab &symtab) override {}
+ bool IsStripped() override { return true; }
+ lldb::ByteOrder GetByteOrder() const override {
+ return m_arch.GetByteOrder();
+ }
+
+ uint32_t GetAddressByteSize() const override {
+ return m_arch.GetAddressByteSize();
+ }
+
+ lldb_private::Address GetBaseAddress() override;
+
+ void CreateSections(lldb_private::SectionList &unified_section_list) override;
+
+ bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
+ bool value_is_offset) override;
+
+ void Dump(lldb_private::Stream *s) override;
+
+ lldb::addr_t GetBaseImageAddress() const { return m_base; }
+
+private:
+ lldb_private::ArchSpec m_arch;
+ lldb_private::UUID m_uuid;
+ lldb::addr_t m_base;
+ lldb::addr_t m_size;
+};
+
+#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_PLACEHOLDER_OBJECTFILEPLACEHOLDER_H
diff --git a/lldb/source/Plugins/Process/minidump/CMakeLists.txt b/lldb/source/Plugins/Process/minidump/CMakeLists.txt
index afa3550dfe48d..9af816884c217 100644
--- a/lldb/source/Plugins/Process/minidump/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/minidump/CMakeLists.txt
@@ -14,6 +14,7 @@ add_lldb_library(lldbPluginProcessMinidump PLUGIN
lldbUtility
lldbPluginProcessUtility
lldbPluginProcessElfCore
+ lldbPluginObjectFilePlaceholder
LINK_COMPONENTS
BinaryFormat
Object
diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
index 5911b137ef419..cf6166ecd77b9 100644
--- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -34,6 +34,7 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Threading.h"
+#include "Plugins/ObjectFile/Placeholder/ObjectFilePlaceholder.h"
#include "Plugins/Process/Utility/StopInfoMachException.h"
#include <memory>
@@ -47,84 +48,6 @@ LLDB_PLUGIN_DEFINE(ProcessMinidump)
namespace {
-/// A minimal ObjectFile implementation providing a dummy object file for the
-/// cases when the real module binary is not available. This allows the module
-/// to show up in "image list" and symbols to be added to it.
-class PlaceholderObjectFile : public ObjectFile {
-public:
- PlaceholderObjectFile(const lldb::ModuleSP &module_sp,
- const ModuleSpec &module_spec, lldb::addr_t base,
- lldb::addr_t size)
- : ObjectFile(module_sp, &module_spec.GetFileSpec(), /*file_offset*/ 0,
- /*length*/ 0, /*data_sp*/ nullptr, /*data_offset*/ 0),
- m_arch(module_spec.GetArchitecture()), m_uuid(module_spec.GetUUID()),
- m_base(base), m_size(size) {
- m_symtab_up = std::make_unique<Symtab>(this);
- }
-
- static ConstString GetStaticPluginName() {
- return ConstString("placeholder");
- }
- llvm::StringRef GetPluginName() override {
- return GetStaticPluginName().GetStringRef();
- }
- bool ParseHeader() override { return true; }
- Type CalculateType() override { return eTypeUnknown; }
- Strata CalculateStrata() override { return eStrataUnknown; }
- uint32_t GetDependentModules(FileSpecList &file_list) override { return 0; }
- bool IsExecutable() const override { return false; }
- ArchSpec GetArchitecture() override { return m_arch; }
- UUID GetUUID() override { return m_uuid; }
- void ParseSymtab(lldb_private::Symtab &symtab) override {}
- bool IsStripped() override { return true; }
- ByteOrder GetByteOrder() const override { return m_arch.GetByteOrder(); }
-
- uint32_t GetAddressByteSize() const override {
- return m_arch.GetAddressByteSize();
- }
-
- Address GetBaseAddress() override {
- return Address(m_sections_up->GetSectionAtIndex(0), 0);
- }
-
- void CreateSections(SectionList &unified_section_list) override {
- m_sections_up = std::make_unique<SectionList>();
- auto section_sp = std::make_shared<Section>(
- GetModule(), this, /*sect_id*/ 0, ConstString(".module_image"),
- eSectionTypeOther, m_base, m_size, /*file_offset*/ 0, /*file_size*/ 0,
- /*log2align*/ 0, /*flags*/ 0);
- section_sp->SetPermissions(ePermissionsReadable | ePermissionsExecutable);
- m_sections_up->AddSection(section_sp);
- unified_section_list.AddSection(std::move(section_sp));
- }
-
- bool SetLoadAddress(Target &target, addr_t value,
- bool value_is_offset) override {
- assert(!value_is_offset);
- assert(value == m_base);
-
- // Create sections if they haven't been created already.
- GetModule()->GetSectionList();
- assert(m_sections_up->GetNumSections(0) == 1);
-
- target.GetSectionLoadList().SetSectionLoadAddress(
- m_sections_up->GetSectionAtIndex(0), m_base);
- return true;
- }
-
- void Dump(Stream *s) override {
- s->Format("Placeholder object file for {0} loaded at [{1:x}-{2:x})\n",
- GetFileSpec(), m_base, m_base + m_size);
- }
-
- lldb::addr_t GetBaseImageAddress() const { return m_base; }
-private:
- ArchSpec m_arch;
- UUID m_uuid;
- lldb::addr_t m_base;
- lldb::addr_t m_size;
-};
-
/// Duplicate the HashElfTextSection() from the breakpad sources.
///
/// Breakpad, a Google crash log reporting tool suite, creates minidump files
@@ -578,12 +501,12 @@ void ProcessMinidump::ReadModuleList() {
// Watch out for place holder modules that have
diff erent paths, but the
// same UUID. If the base address is
diff erent, create a new module. If
// we don't then we will end up setting the load address of a
diff erent
- // PlaceholderObjectFile and an assertion will fire.
+ // ObjectFilePlaceholder and an assertion will fire.
auto *objfile = module_sp->GetObjectFile();
if (objfile &&
objfile->GetPluginName() ==
- PlaceholderObjectFile::GetStaticPluginName().GetStringRef()) {
- if (((PlaceholderObjectFile *)objfile)->GetBaseImageAddress() !=
+ ObjectFilePlaceholder::GetPluginNameStatic()) {
+ if (((ObjectFilePlaceholder *)objfile)->GetBaseImageAddress() !=
load_addr)
module_sp.reset();
}
@@ -601,7 +524,7 @@ void ProcessMinidump::ReadModuleList() {
"placeholder module for: {0}",
name);
- module_sp = Module::CreateModuleFromObjectFile<PlaceholderObjectFile>(
+ module_sp = Module::CreateModuleFromObjectFile<ObjectFilePlaceholder>(
module_spec, load_addr, load_size);
GetTarget().GetImages().Append(module_sp, true /* notify */);
}
More information about the lldb-commits
mailing list