Summary: The contents of the gnu_debuglink section were passed through the GetDebugSymbolFilePaths interface, which was more generic than needed. As the only class implementing this function is ObjectFileELF, we can modify the function to return just a single FileSpec (instead of a list). Also, since the SymbolVendorELF already assumes ELF object files, we don't have to make this method available on the generic ObjectFile interface -- instead we can put it on ObjectFileELF directly. This change also makes is so that if the Module has an explicit symbol file spec set, we disregard the value the value of the debug link (instead of doing a secondary lookup using that). I think it makes sense to honor the users wishes if he had explicitly set the symbol file spec, and this seems to be consistent with what SymbolVendorMacOSX is doing (SymbolVendorMacOSX.cpp:125). The main reason for making these changes is to make the treatment of build-ids and debug links simpler in the follow-up patch. Reviewers: clayborg, jankratochvil, mgorny, espindola Subscribers: emaste, arichardson, MaskRay, lldb-commits Differential Revision: https://reviews.llvm.org/D65560 llvm-svn: 367824
107 lines
3.4 KiB
C++
107 lines
3.4 KiB
C++
//===-- ObjectFileBreakpad.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_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
|
|
#define LLDB_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
|
|
|
|
#include "lldb/Symbol/ObjectFile.h"
|
|
#include "lldb/Utility/ArchSpec.h"
|
|
|
|
namespace lldb_private {
|
|
namespace breakpad {
|
|
|
|
class ObjectFileBreakpad : public ObjectFile {
|
|
public:
|
|
// Static Functions
|
|
static void Initialize();
|
|
static void Terminate();
|
|
|
|
static ConstString GetPluginNameStatic();
|
|
static const char *GetPluginDescriptionStatic() {
|
|
return "Breakpad object file reader.";
|
|
}
|
|
|
|
static ObjectFile *
|
|
CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
|
|
lldb::offset_t data_offset, const FileSpec *file,
|
|
lldb::offset_t file_offset, lldb::offset_t length);
|
|
|
|
static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp,
|
|
lldb::DataBufferSP &data_sp,
|
|
const lldb::ProcessSP &process_sp,
|
|
lldb::addr_t header_addr);
|
|
|
|
static size_t GetModuleSpecifications(const FileSpec &file,
|
|
lldb::DataBufferSP &data_sp,
|
|
lldb::offset_t data_offset,
|
|
lldb::offset_t file_offset,
|
|
lldb::offset_t length,
|
|
ModuleSpecList &specs);
|
|
|
|
// PluginInterface protocol
|
|
ConstString GetPluginName() override { return GetPluginNameStatic(); }
|
|
|
|
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;
|
|
|
|
lldb::ByteOrder GetByteOrder() const override {
|
|
return m_arch.GetByteOrder();
|
|
}
|
|
|
|
bool IsExecutable() const override { return false; }
|
|
|
|
uint32_t GetAddressByteSize() const override {
|
|
return m_arch.GetAddressByteSize();
|
|
}
|
|
|
|
AddressClass GetAddressClass(lldb::addr_t file_addr) override {
|
|
return AddressClass::eInvalid;
|
|
}
|
|
|
|
Symtab *GetSymtab() override;
|
|
|
|
bool IsStripped() override { return false; }
|
|
|
|
void CreateSections(SectionList &unified_section_list) override;
|
|
|
|
void Dump(Stream *s) override {}
|
|
|
|
ArchSpec GetArchitecture() override { return m_arch; }
|
|
|
|
UUID GetUUID() override { return m_uuid; }
|
|
|
|
uint32_t GetDependentModules(FileSpecList &files) override { return 0; }
|
|
|
|
Type CalculateType() override { return eTypeDebugInfo; }
|
|
|
|
Strata CalculateStrata() override { return eStrataUser; }
|
|
|
|
private:
|
|
ArchSpec m_arch;
|
|
UUID m_uuid;
|
|
|
|
ObjectFileBreakpad(const lldb::ModuleSP &module_sp,
|
|
lldb::DataBufferSP &data_sp, lldb::offset_t data_offset,
|
|
const FileSpec *file, lldb::offset_t offset,
|
|
lldb::offset_t length, ArchSpec arch, UUID uuid);
|
|
};
|
|
|
|
} // namespace breakpad
|
|
} // namespace lldb_private
|
|
#endif // LLDB_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
|