Skip to content

Commit

Permalink
Add llvm-style RTTI to ObjectFile hierarchy
Browse files Browse the repository at this point in the history
Summary:
On the heels of D62934, this patch uses the same approach to introduce
llvm RTTI support to the ObjectFile hierarchy. It also replaces the
existing uses of GetPluginName doing run-time type checks with
llvm::dyn_cast and friends.

This formally introduces new dependencies from some other plugins to
ObjectFile plugins. However, I believe this is fine because:
- these dependencies were already kind of there, and the only reason
  we could get away with not modeling them explicitly was because the
  code was relying on magically knowing what will GetPluginName() return
  for a particular kind of object files.
- the dependencies themselves are logical (it makes sense for
  SymbolVendorELF to depend on ObjectFileELF), or at least don't
  actively get in the way (the JitLoaderGDB->MachO thing).
- they don't introduce any new dependency loops as ObjectFile plugins
  don't depend on any other plugins

Reviewers: xiaobai, JDevlieghere, espindola

Subscribers: emaste, mgorny, arichardson, MaskRay, lldb-commits

Differential Revision: https://reviews.llvm.org/D65450

llvm-svn: 367413
  • Loading branch information
labath committed Jul 31, 2019
1 parent 24e4e80 commit e84f784
Show file tree
Hide file tree
Showing 20 changed files with 76 additions and 35 deletions.
4 changes: 4 additions & 0 deletions lldb/include/lldb/Symbol/ObjectFile.h
Expand Up @@ -204,6 +204,10 @@ class ObjectFile : public std::enable_shared_from_this<ObjectFile>,
const char *path_with_object, lldb_private::FileSpec &archive_file,
lldb_private::ConstString &archive_object, bool must_exist);

// LLVM RTTI support
static char ID;
virtual bool isA(const void *ClassID) const { return ClassID == &ID; }

/// Gets the address size in bytes for the current object file.
///
/// \return
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Plugins/JITLoader/GDB/CMakeLists.txt
Expand Up @@ -16,6 +16,7 @@ add_lldb_library(lldbPluginJITLoaderGDB PLUGIN
lldbSymbol
lldbTarget
lldbUtility
lldbPluginObjectFileMachO
LINK_COMPONENTS
Support
)
Expand Down
32 changes: 13 additions & 19 deletions lldb/source/Plugins/JITLoader/GDB/JITLoaderGDB.cpp
Expand Up @@ -6,9 +6,8 @@
//
//===----------------------------------------------------------------------===//


#include "llvm/Support/MathExtras.h"

#include "JITLoaderGDB.h"
#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
#include "lldb/Breakpoint/Breakpoint.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
Expand All @@ -26,8 +25,7 @@
#include "lldb/Utility/LLDBAssert.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/StreamString.h"

#include "JITLoaderGDB.h"
#include "llvm/Support/MathExtras.h"

#include <memory>

Expand Down Expand Up @@ -326,20 +324,16 @@ bool JITLoaderGDB::ReadJITDescriptorImpl(bool all_entries) {
module_sp->GetObjectFile()->GetSymtab();

m_jit_objects.insert(std::make_pair(symbolfile_addr, module_sp));
if (module_sp->GetObjectFile()->GetPluginName() ==
ConstString("mach-o")) {
ObjectFile *image_object_file = module_sp->GetObjectFile();
if (image_object_file) {
const SectionList *section_list =
image_object_file->GetSectionList();
if (section_list) {
uint64_t vmaddrheuristic = 0;
uint64_t lower = (uint64_t)-1;
uint64_t upper = 0;
updateSectionLoadAddress(*section_list, target, symbolfile_addr,
symbolfile_size, vmaddrheuristic, lower,
upper);
}
if (auto image_object_file =
llvm::dyn_cast<ObjectFileMachO>(module_sp->GetObjectFile())) {
const SectionList *section_list = image_object_file->GetSectionList();
if (section_list) {
uint64_t vmaddrheuristic = 0;
uint64_t lower = (uint64_t)-1;
uint64_t upper = 0;
updateSectionLoadAddress(*section_list, target, symbolfile_addr,
symbolfile_size, vmaddrheuristic, lower,
upper);
}
} else {
bool changed = false;
Expand Down
Expand Up @@ -42,6 +42,8 @@ llvm::Optional<Header> Header::parse(llvm::StringRef text) {
return Header{ArchSpec(triple), std::move(uuid)};
}

char ObjectFileBreakpad::ID;

void ObjectFileBreakpad::Initialize() {
PluginManager::RegisterPlugin(GetPluginNameStatic(),
GetPluginDescriptionStatic(), CreateInstance,
Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Plugins/ObjectFile/Breakpad/ObjectFileBreakpad.h
Expand Up @@ -48,6 +48,13 @@ class ObjectFileBreakpad : public ObjectFile {

uint32_t GetPluginVersion() override { return 1; }

// LLVM RTTI support
static char ID;
bool isA(const void *ClassID) const override {
return ClassID == &ID || ObjectFile::isA(ClassID);
}
static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }

// ObjectFile Protocol.

bool ParseHeader() override;
Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
Expand Up @@ -333,6 +333,8 @@ static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
return LLDB_INVALID_CPUTYPE;
}

char ObjectFileELF::ID;

// Arbitrary constant used as UUID prefix for core files.
const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);

Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
Expand Up @@ -89,6 +89,13 @@ class ObjectFileELF : public lldb_private::ObjectFile {

uint32_t GetPluginVersion() override;

// LLVM RTTI support
static char ID;
bool isA(const void *ClassID) const override {
return ClassID == &ID || ObjectFile::isA(ClassID);
}
static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }

// ObjectFile Protocol.
bool ParseHeader() override;

Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Plugins/ObjectFile/JIT/ObjectFileJIT.cpp
Expand Up @@ -39,6 +39,8 @@
using namespace lldb;
using namespace lldb_private;

char ObjectFileJIT::ID;

void ObjectFileJIT::Initialize() {
PluginManager::RegisterPlugin(GetPluginNameStatic(),
GetPluginDescriptionStatic(), CreateInstance,
Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Plugins/ObjectFile/JIT/ObjectFileJIT.h
Expand Up @@ -46,6 +46,13 @@ class ObjectFileJIT : public lldb_private::ObjectFile {
lldb::offset_t length,
lldb_private::ModuleSpecList &specs);

// LLVM RTTI support
static char ID;
bool isA(const void *ClassID) const override {
return ClassID == &ID || ObjectFile::isA(ClassID);
}
static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }

// Member Functions
bool ParseHeader() override;

Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
Expand Up @@ -830,6 +830,8 @@ static uint32_t MachHeaderSizeFromMagic(uint32_t magic) {

#define MACHO_NLIST_ARM_SYMBOL_IS_THUMB 0x0008

char ObjectFileMachO::ID;

void ObjectFileMachO::Initialize() {
PluginManager::RegisterPlugin(
GetPluginNameStatic(), GetPluginDescriptionStatic(), CreateInstance,
Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
Expand Up @@ -63,6 +63,13 @@ class ObjectFileMachO : public lldb_private::ObjectFile {
static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
lldb::addr_t length);

// LLVM RTTI support
static char ID;
bool isA(const void *ClassID) const override {
return ClassID == &ID || ObjectFile::isA(ClassID);
}
static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }

// Member Functions
bool ParseHeader() override;

Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
Expand Up @@ -88,6 +88,8 @@ static UUID GetCoffUUID(llvm::object::COFFObjectFile *coff_obj) {
return UUID();
}

char ObjectFilePECOFF::ID;

void ObjectFilePECOFF::Initialize() {
PluginManager::RegisterPlugin(
GetPluginNameStatic(), GetPluginDescriptionStatic(), CreateInstance,
Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
Expand Up @@ -85,6 +85,13 @@ class ObjectFilePECOFF : public lldb_private::ObjectFile {

static lldb::SymbolType MapSymbolType(uint16_t coff_symbol_type);

// LLVM RTTI support
static char ID;
bool isA(const void *ClassID) const override {
return ClassID == &ID || ObjectFile::isA(ClassID);
}
static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }

bool ParseHeader() override;

bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
Expand Down
Expand Up @@ -179,10 +179,7 @@ ConstString SymbolFileBreakpad::GetPluginNameStatic() {
}

uint32_t SymbolFileBreakpad::CalculateAbilities() {
if (!m_objfile_sp)
return 0;
if (m_objfile_sp->GetPluginName() !=
ObjectFileBreakpad::GetPluginNameStatic())
if (!m_objfile_sp || !llvm::isa<ObjectFileBreakpad>(*m_objfile_sp))
return 0;

return CompileUnits | Functions | LineTables;
Expand Down
Expand Up @@ -120,6 +120,8 @@ loadMatchingPDBFile(std::string exe_path, llvm::BumpPtrAllocator &allocator) {
}
OwningBinary<Binary> binary = std::move(*expected_binary);

// TODO: Avoid opening the PE/COFF binary twice by reading this information
// directly from the lldb_private::ObjectFile.
auto *obj = llvm::dyn_cast<llvm::object::COFFObjectFile>(binary.getBinary());
if (!obj)
return nullptr;
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Plugins/SymbolVendor/ELF/CMakeLists.txt
Expand Up @@ -5,4 +5,5 @@ add_lldb_library(lldbPluginSymbolVendorELF PLUGIN
lldbCore
lldbHost
lldbSymbol
lldbPluginObjectFileELF
)
9 changes: 3 additions & 6 deletions lldb/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
Expand Up @@ -10,6 +10,7 @@

#include <string.h>

#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
Expand Down Expand Up @@ -61,15 +62,11 @@ SymbolVendorELF::CreateInstance(const lldb::ModuleSP &module_sp,
if (!module_sp)
return nullptr;

ObjectFile *obj_file = module_sp->GetObjectFile();
ObjectFileELF *obj_file =
llvm::dyn_cast_or_null<ObjectFileELF>(module_sp->GetObjectFile());
if (!obj_file)
return nullptr;

static ConstString obj_file_elf("elf");
ConstString obj_name = obj_file->GetPluginName();
if (obj_name != obj_file_elf)
return nullptr;

lldb_private::UUID uuid = obj_file->GetUUID();
if (!uuid)
return nullptr;
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Plugins/SymbolVendor/MacOSX/CMakeLists.txt
Expand Up @@ -7,4 +7,5 @@ add_lldb_library(lldbPluginSymbolVendorMacOSX PLUGIN
lldbCore
lldbHost
lldbSymbol
lldbPluginObjectFileMachO
)
Expand Up @@ -10,6 +10,7 @@

#include <string.h>

#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
Expand Down Expand Up @@ -97,15 +98,11 @@ SymbolVendorMacOSX::CreateInstance(const lldb::ModuleSP &module_sp,
if (!module_sp)
return NULL;

ObjectFile *obj_file = module_sp->GetObjectFile();
ObjectFile *obj_file =
llvm::dyn_cast_or_null<ObjectFileMachO>(module_sp->GetObjectFile());
if (!obj_file)
return NULL;

static ConstString obj_file_macho("mach-o");
ConstString obj_name = obj_file->GetPluginName();
if (obj_name != obj_file_macho)
return NULL;

static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Timer scoped_timer(func_cat,
"SymbolVendorMacOSX::CreateInstance (module = %s)",
Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Symbol/ObjectFile.cpp
Expand Up @@ -26,6 +26,8 @@
using namespace lldb;
using namespace lldb_private;

char ObjectFile::ID;

ObjectFileSP
ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file,
lldb::offset_t file_offset, lldb::offset_t file_size,
Expand Down

0 comments on commit e84f784

Please sign in to comment.