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 #include "llvm/ADT/Triple.h"
16 
17 namespace lldb_private {
18 namespace breakpad {
19 
20 class ObjectFileBreakpad : public ObjectFile {
21 public:
22   //------------------------------------------------------------------
23   // Static Functions
24   //------------------------------------------------------------------
25   static void Initialize();
26   static void Terminate();
27 
28   static ConstString GetPluginNameStatic();
29   static const char *GetPluginDescriptionStatic() {
30     return "Breakpad object file reader.";
31   }
32 
33   static ObjectFile *
34   CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
35                  lldb::offset_t data_offset, const FileSpec *file,
36                  lldb::offset_t file_offset, lldb::offset_t length);
37 
38   static size_t GetModuleSpecifications(const FileSpec &file,
39                                         lldb::DataBufferSP &data_sp,
40                                         lldb::offset_t data_offset,
41                                         lldb::offset_t file_offset,
42                                         lldb::offset_t length,
43                                         ModuleSpecList &specs);
44 
45   //------------------------------------------------------------------
46   // PluginInterface protocol
47   //------------------------------------------------------------------
48   ConstString GetPluginName() override { return GetPluginNameStatic(); }
49 
50   uint32_t GetPluginVersion() override { return 1; }
51 
52   //------------------------------------------------------------------
53   // ObjectFile Protocol.
54   //------------------------------------------------------------------
55 
56   bool ParseHeader() override;
57 
58   lldb::ByteOrder GetByteOrder() const override {
59     return m_arch.GetByteOrder();
60   }
61 
62   bool IsExecutable() const override { return false; }
63 
64   uint32_t GetAddressByteSize() const override {
65     return m_arch.GetAddressByteSize();
66   }
67 
68   AddressClass GetAddressClass(lldb::addr_t file_addr) override {
69     return AddressClass::eInvalid;
70   }
71 
72   Symtab *GetSymtab() override;
73 
74   bool IsStripped() override { return false; }
75 
76   void CreateSections(SectionList &unified_section_list) override;
77 
78   void Dump(Stream *s) override {}
79 
80   bool GetArchitecture(ArchSpec &arch) override;
81 
82   bool GetUUID(UUID *uuid) override;
83 
84   FileSpecList GetDebugSymbolFilePaths() override { return FileSpecList(); }
85 
86   uint32_t GetDependentModules(FileSpecList &files) override { return 0; }
87 
88   Type CalculateType() override { return eTypeDebugInfo; }
89 
90   Strata CalculateStrata() override { return eStrataUser; }
91 
92 private:
93   ArchSpec m_arch;
94   UUID m_uuid;
95 
96   ObjectFileBreakpad(const lldb::ModuleSP &module_sp,
97                      lldb::DataBufferSP &data_sp, lldb::offset_t data_offset,
98                      const FileSpec *file, lldb::offset_t offset,
99                      lldb::offset_t length, ArchSpec arch, UUID uuid);
100 };
101 
102 } // namespace breakpad
103 } // namespace lldb_private
104 #endif // LLDB_PLUGINS_OBJECTFILE_BREAKPAD_OBJECTFILEBREAKPAD_H
105