1 //===-- ObjectFileBreakpad.h ---------------------------------- -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLDB_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
11 #define LLDB_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
12 
13 #include "lldb/Symbol/ObjectFile.h"
14 #include "lldb/Utility/ArchSpec.h"
15 
16 namespace lldb_private {
17 namespace breakpad {
18 
19 class ObjectFileBreakpad : public ObjectFile {
20 public:
21   //------------------------------------------------------------------
22   // Static Functions
23   //------------------------------------------------------------------
24   static void Initialize();
25   static void Terminate();
26 
27   static ConstString GetPluginNameStatic();
28   static const char *GetPluginDescriptionStatic() {
29     return "Breakpad object file reader.";
30   }
31 
32   static ObjectFile *
33   CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
34                  lldb::offset_t data_offset, const FileSpec *file,
35                  lldb::offset_t file_offset, lldb::offset_t length);
36 
37   static ObjectFile *CreateMemoryInstance(const lldb::ModuleSP &module_sp,
38                                           lldb::DataBufferSP &data_sp,
39                                           const lldb::ProcessSP &process_sp,
40                                           lldb::addr_t header_addr);
41 
42   static size_t GetModuleSpecifications(const FileSpec &file,
43                                         lldb::DataBufferSP &data_sp,
44                                         lldb::offset_t data_offset,
45                                         lldb::offset_t file_offset,
46                                         lldb::offset_t length,
47                                         ModuleSpecList &specs);
48 
49   //------------------------------------------------------------------
50   // PluginInterface protocol
51   //------------------------------------------------------------------
52   ConstString GetPluginName() override { return GetPluginNameStatic(); }
53 
54   uint32_t GetPluginVersion() override { return 1; }
55 
56   //------------------------------------------------------------------
57   // ObjectFile Protocol.
58   //------------------------------------------------------------------
59 
60   bool ParseHeader() override;
61 
62   lldb::ByteOrder GetByteOrder() const override {
63     return m_arch.GetByteOrder();
64   }
65 
66   bool IsExecutable() const override { return false; }
67 
68   uint32_t GetAddressByteSize() const override {
69     return m_arch.GetAddressByteSize();
70   }
71 
72   AddressClass GetAddressClass(lldb::addr_t file_addr) override {
73     return AddressClass::eInvalid;
74   }
75 
76   Symtab *GetSymtab() override;
77 
78   bool IsStripped() override { return false; }
79 
80   void CreateSections(SectionList &unified_section_list) override;
81 
82   void Dump(Stream *s) override {}
83 
84   ArchSpec GetArchitecture() override { return m_arch; }
85 
86   bool GetUUID(UUID *uuid) override;
87 
88   FileSpecList GetDebugSymbolFilePaths() override { return FileSpecList(); }
89 
90   uint32_t GetDependentModules(FileSpecList &files) override { return 0; }
91 
92   Type CalculateType() override { return eTypeDebugInfo; }
93 
94   Strata CalculateStrata() override { return eStrataUser; }
95 
96 private:
97   ArchSpec m_arch;
98   UUID m_uuid;
99 
100   ObjectFileBreakpad(const lldb::ModuleSP &module_sp,
101                      lldb::DataBufferSP &data_sp, lldb::offset_t data_offset,
102                      const FileSpec *file, lldb::offset_t offset,
103                      lldb::offset_t length, ArchSpec arch, UUID uuid);
104 };
105 
106 } // namespace breakpad
107 } // namespace lldb_private
108 #endif // LLDB_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
109