1 //===-- ObjectFileMachO.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 liblldb_ObjectFileMachO_h_
11 #define liblldb_ObjectFileMachO_h_
12 
13 #include "llvm/Support/MachO.h"
14 
15 #include "lldb/Core/Address.h"
16 #include "lldb/Host/FileSpec.h"
17 #include "lldb/Host/Mutex.h"
18 #include "lldb/Symbol/ObjectFile.h"
19 
20 //----------------------------------------------------------------------
21 // This class needs to be hidden as eventually belongs in a plugin that
22 // will export the ObjectFile protocol
23 //----------------------------------------------------------------------
24 class ObjectFileMachO :
25     public lldb_private::ObjectFile
26 {
27 public:
28     //------------------------------------------------------------------
29     // Static Functions
30     //------------------------------------------------------------------
31     static void
32     Initialize();
33 
34     static void
35     Terminate();
36 
37     static const char *
38     GetPluginNameStatic();
39 
40     static const char *
41     GetPluginDescriptionStatic();
42 
43     static ObjectFile *
44     CreateInstance (lldb_private::Module* module,
45                     lldb::DataBufferSP& dataSP,
46                     const lldb_private::FileSpec* file,
47                     lldb::addr_t offset,
48                     lldb::addr_t length);
49 
50     static bool
51     MagicBytesMatch (lldb::DataBufferSP& dataSP,
52                      lldb::addr_t offset,
53                      lldb::addr_t length);
54 
55     //------------------------------------------------------------------
56     // Member Functions
57     //------------------------------------------------------------------
58     ObjectFileMachO (lldb_private::Module* module,
59                      lldb::DataBufferSP& dataSP,
60                      const lldb_private::FileSpec* file,
61                      lldb::addr_t offset,
62                      lldb::addr_t length);
63 
64     virtual
65     ~ObjectFileMachO();
66 
67     virtual bool
68     ParseHeader ();
69 
70     virtual lldb::ByteOrder
71     GetByteOrder () const;
72 
73     virtual bool
74     IsExecutable () const;
75 
76     virtual size_t
77     GetAddressByteSize ()  const;
78 
79     virtual lldb_private::AddressClass
80     GetAddressClass (lldb::addr_t file_addr);
81 
82     virtual lldb_private::Symtab *
83     GetSymtab();
84 
85     virtual lldb_private::SectionList *
86     GetSectionList();
87 
88     virtual void
89     Dump (lldb_private::Stream *s);
90 
91     virtual bool
92     GetArchitecture (lldb_private::ArchSpec &arch);
93 
94     virtual bool
95     GetUUID (lldb_private::UUID* uuid);
96 
97     virtual uint32_t
98     GetDependentModules (lldb_private::FileSpecList& files);
99 
100     //------------------------------------------------------------------
101     // PluginInterface protocol
102     //------------------------------------------------------------------
103     virtual const char *
104     GetPluginName();
105 
106     virtual const char *
107     GetShortPluginName();
108 
109     virtual uint32_t
110     GetPluginVersion();
111 
112     virtual lldb_private::Address
113     GetEntryPointAddress ();
114 
115     virtual ObjectFile::Type
116     CalculateType();
117 
118     virtual ObjectFile::Strata
119     CalculateStrata();
120 
121 protected:
122     mutable lldb_private::Mutex m_mutex;
123     llvm::MachO::mach_header m_header;
124     mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap;
125     mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap;
126 
127     llvm::MachO::dysymtab_command m_dysymtab;
128     std::vector<llvm::MachO::segment_command_64> m_mach_segments;
129     std::vector<llvm::MachO::section_64> m_mach_sections;
130     lldb_private::Address  m_entry_point_address;
131 
132     size_t
133     ParseSections ();
134 
135     size_t
136     ParseSymtab (bool minimize);
137 
138 };
139 
140 #endif  // liblldb_ObjectFileMachO_h_
141