1e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//===-- ObjectFilePECOFF.h --------------------------------------*- C++ -*-===//
2e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
3e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//                     The LLVM Compiler Infrastructure
4e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
5e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// This file is distributed under the University of Illinois Open Source
6e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// License. See LICENSE.TXT for details.
7e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
8e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//===----------------------------------------------------------------------===//
9e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
10e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#ifndef liblldb_ObjectFilePECOFF_h_
11e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define liblldb_ObjectFilePECOFF_h_
12e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
13e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include <vector>
14e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
15e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Symbol/ObjectFile.h"
16e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
17e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonclass ObjectFilePECOFF :
18e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    public lldb_private::ObjectFile
19e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
20e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonpublic:
21e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
22e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    //------------------------------------------------------------------
23e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    // Static Functions
24e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    //------------------------------------------------------------------
25e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    static void
26e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    Initialize();
27e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
28e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    static void
29e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    Terminate();
30e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
310e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static lldb_private::ConstString
32e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetPluginNameStatic();
33e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
34e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    static const char *
35e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetPluginDescriptionStatic();
36e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
37e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    static ObjectFile *
383508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    CreateInstance (const lldb::ModuleSP &module_sp,
39cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                    lldb::DataBufferSP& data_sp,
40cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                    lldb::offset_t data_offset,
41e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    const lldb_private::FileSpec* file,
42cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                    lldb::offset_t offset,
43cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                    lldb::offset_t length);
44e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
45b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static lldb_private::ObjectFile *
463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    CreateMemoryInstance (const lldb::ModuleSP &module_sp,
47b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                          lldb::DataBufferSP& data_sp,
48b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                          const lldb::ProcessSP &process_sp,
49b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                          lldb::addr_t header_addr);
5036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
5136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    static size_t
5236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    GetModuleSpecifications (const lldb_private::FileSpec& file,
5336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                             lldb::DataBufferSP& data_sp,
5436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                             lldb::offset_t data_offset,
5536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                             lldb::offset_t file_offset,
5636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                             lldb::offset_t length,
5736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                             lldb_private::ModuleSpecList &specs);
5836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
59e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    static bool
60cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    MagicBytesMatch (lldb::DataBufferSP& data_sp);
61e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
62e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    ObjectFilePECOFF (const lldb::ModuleSP &module_sp,
64cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                      lldb::DataBufferSP& data_sp,
65cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                      lldb::offset_t data_offset,
66e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                      const lldb_private::FileSpec* file,
67cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                      lldb::offset_t file_offset,
68cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                      lldb::offset_t length);
69e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
70e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	virtual
71e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    ~ObjectFilePECOFF();
72e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
73e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual bool
74e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    ParseHeader ();
75e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
76e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual lldb::ByteOrder
77e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetByteOrder () const;
78e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
79e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual bool
80e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    IsExecutable () const;
81e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
8236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    virtual uint32_t
83e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetAddressByteSize ()  const;
84e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
85e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//    virtual lldb_private::AddressClass
86e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//    GetAddressClass (lldb::addr_t file_addr);
87e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
88e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual lldb_private::Symtab *
897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    GetSymtab ();
90e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    virtual bool
927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    IsStripped ();
937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    virtual void
957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    CreateSections (lldb_private::SectionList &unified_section_list);
96e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
97e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual void
98e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    Dump (lldb_private::Stream *s);
99e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
100e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual bool
101e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetArchitecture (lldb_private::ArchSpec &arch);
102e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
103e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual bool
104e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetUUID (lldb_private::UUID* uuid);
105e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
106e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual uint32_t
107e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetDependentModules (lldb_private::FileSpecList& files);
108e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
109e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    //------------------------------------------------------------------
110e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    // PluginInterface protocol
111e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    //------------------------------------------------------------------
1120e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    virtual lldb_private::ConstString
113e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetPluginName();
114e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
115e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual uint32_t
116e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetPluginVersion();
117e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
118e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//    virtual lldb_private::Address
119e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//    GetEntryPointAddress ();
120e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
121e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual ObjectFile::Type
122e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    CalculateType();
123e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
124e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    virtual ObjectFile::Strata
125e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    CalculateStrata();
126e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
127e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonprotected:
128e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	bool NeedsEndianSwap() const;
129e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
130e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef struct dos_header  {  // DOS .EXE header
131e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_magic;         // Magic number
132e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_cblp;          // Bytes on last page of file
133e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_cp;            // Pages in file
134e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_crlc;          // Relocations
135e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_cparhdr;       // Size of header in paragraphs
136e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_minalloc;      // Minimum extra paragraphs needed
137e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_maxalloc;      // Maximum extra paragraphs needed
138e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_ss;            // Initial (relative) SS value
139e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_sp;            // Initial SP value
140e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_csum;          // Checksum
141e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_ip;            // Initial IP value
142e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_cs;            // Initial (relative) CS value
143e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_lfarlc;        // File address of relocation table
144e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_ovno;          // Overlay number
145e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_res[4];        // Reserved words
146e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_oemid;         // OEM identifier (for e_oeminfo)
147e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_oeminfo;       // OEM information; e_oemid specific
148e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t e_res2[10];      // Reserved words
149e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t e_lfanew;        // File address of new exe header
150e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    } dos_header_t;
151e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
152e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef struct coff_header {
153e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t machine;
154e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t nsects;
155e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t modtime;
156e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t symoff;
157e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t nsyms;
158e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t hdrsize;
159e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t flags;
160e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	} coff_header_t;
161e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
162e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef struct data_directory {
163e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t vmaddr;
164e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t vmsize;
165e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	} data_directory_t;
166e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
167e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef struct coff_opt_header
168e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	{
169e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	magic;
170e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint8_t		major_linker_version;
171e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint8_t		minor_linker_version;
172e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	code_size;
173e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	data_size;
174e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	bss_size;
175e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	entry;
176e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	code_offset;
177e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	data_offset;
178e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
179e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint64_t	image_base;
180e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	sect_alignment;
181e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	file_alignment;
182e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	major_os_system_version;
183e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	minor_os_system_version;
184e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	major_image_version;
185e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	minor_image_version;
186e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	major_subsystem_version;
187e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	minor_subsystem_version;
188e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	reserved1;
189e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	image_size;
190e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	header_size;
191707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton		uint32_t	checksum;
192e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	subsystem;
193e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	dll_flags;
194e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint64_t	stack_reserve_size;
195e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint64_t	stack_commit_size;
196e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint64_t	heap_reserve_size;
197e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint64_t	heap_commit_size;
198e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	loader_flags;
199e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        //    uint32_t	num_data_dir_entries;
200e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		std::vector<data_directory> data_dirs;	// will contain num_data_dir_entries entries
201e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	} coff_opt_header_t;
202e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
203e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef struct section_header {
204e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		char		name[8];
205e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	vmsize;	// Virtual Size
206e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	vmaddr;	// Virtual Addr
207e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	size;	// File size
208e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	offset;	// File offset
209e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	reloff;	// Offset to relocations
210e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	lineoff;// Offset to line table entries
211e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	nreloc;	// Number of relocation entries
212e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	nline;	// Number of line table entries
213e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	flags;
214e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	} section_header_t;
215e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
216e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef struct coff_symbol {
217e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		char		name[8];
218e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint32_t	value;
219e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	sect;
220e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint16_t	type;
221e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint8_t		storage;
222e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton		uint8_t		naux;
223e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	} coff_symbol_t;
224e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
225e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	bool ParseDOSHeader ();
22636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton	bool ParseCOFFHeader (lldb::offset_t *offset_ptr);
22736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton	bool ParseCOFFOptionalHeader (lldb::offset_t *offset_ptr);
228e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	bool ParseSectionHeaders (uint32_t offset);
229e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
230e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	static	void DumpDOSHeader(lldb_private::Stream *s, const dos_header_t& header);
231e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	static	void DumpCOFFHeader(lldb_private::Stream *s, const coff_header_t& header);
232e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	static	void DumpOptCOFFHeader(lldb_private::Stream *s, const coff_opt_header_t& header);
233e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    void DumpSectionHeaders(lldb_private::Stream *s);
234e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    void DumpSectionHeader(lldb_private::Stream *s, const section_header_t& sh);
235e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    bool GetSectionName(std::string& sect_name, const section_header_t& sect);
236e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
237e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef std::vector<section_header_t>		SectionHeaderColl;
238e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef SectionHeaderColl::iterator			SectionHeaderCollIter;
239e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	typedef SectionHeaderColl::const_iterator	SectionHeaderCollConstIter;
240e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonprivate:
241e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	dos_header_t		m_dos_header;
242e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	coff_header_t		m_coff_header;
243e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	coff_opt_header_t	m_coff_header_opt;
244e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton	SectionHeaderColl	m_sect_headers;
245e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton};
246e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
247e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#endif  // #ifndef liblldb_ObjectFilePECOFF_h_
248