1e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//===-- ObjectFilePECOFF.cpp ------------------------------------*- 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#include "ObjectFilePECOFF.h"
11e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
12e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "llvm/Support/MachO.h"
13e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
14e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/ArchSpec.h"
15e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/DataBuffer.h"
16e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Host/FileSpec.h"
17e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/FileSpecList.h"
18e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/Module.h"
1936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton#include "lldb/Core/ModuleSpec.h"
20e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/PluginManager.h"
21e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/Section.h"
22e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/StreamFile.h"
23e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/StreamString.h"
24e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/Timer.h"
25e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/UUID.h"
26e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Symbol/ObjectFile.h"
27e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
28e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonstatic uint32_t COFFMachineToMachCPU(uint16_t machine);
29e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
30e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_UNKNOWN      0x0000
31e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_AM33         0x01d3  // Matsushita AM33
32e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_AMD64        0x8664  // x64
33e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_ARM          0x01c0  // ARM little endian
34e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_EBC          0x0ebc  // EFI byte code
35e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_I386         0x014c  // Intel 386 or later processors and compatible processors
36e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_IA64         0x0200  // Intel Itanium processor family
37e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_M32R         0x9041  // Mitsubishi M32R little endian
38e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_MIPS16       0x0266  // MIPS16
39e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_MIPSFPU      0x0366  // MIPS with FPU
40e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_MIPSFPU16    0x0466  // MIPS16 with FPU
41e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_POWERPC      0x01f0  // Power PC little endian
42e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_POWERPCFP    0x01f1  // Power PC with floating point support
43e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_R4000        0x0166  // MIPS little endian
44e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH3          0x01a2  // Hitachi SH3
45e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH3DSP       0x01a3  // Hitachi SH3 DSP
46e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH4          0x01a6  // Hitachi SH4
47e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH5          0x01a8  // Hitachi SH5
48e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_THUMB        0x01c2  // Thumb
49e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_WCEMIPSV2    0x0169  // MIPS little-endian WCE v2
50e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
51e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
52e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_DOS_SIGNATURE             0x5A4D      // MZ
53e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_OS2_SIGNATURE             0x454E      // NE
54e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_OS2_SIGNATURE_LE          0x454C      // LE
55e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_NT_SIGNATURE              0x00004550  // PE00
56e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define OPT_HEADER_MAGIC_PE32           0x010b
57e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define OPT_HEADER_MAGIC_PE32_PLUS      0x020b
58e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
59e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_RELOCS_STRIPPED          0x0001
60e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_EXECUTABLE_IMAGE         0x0002
61e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_LINE_NUMS_STRIPPED       0x0004
62e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_LOCAL_SYMS_STRIPPED      0x0008
63e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_AGGRESSIVE_WS_TRIM       0x0010
64e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_LARGE_ADDRESS_AWARE      0x0020
65e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//#define                                   0x0040  // Reserved
66e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_BYTES_REVERSED_LO        0x0080
67e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_32BIT_MACHINE            0x0100
68e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_DEBUG_STRIPPED           0x0200
69e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP  0x0400
70e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_NET_RUN_FROM_SWAP        0x0800
71e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_SYSTEM                   0x1000
72e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_DLL                      0x2000
73e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_UP_SYSTEM_ONLY           0x4000
74e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_BYTES_REVERSED_HI        0x8000
75e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
76707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton
77707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton// Section Flags
78707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton// The section flags in the Characteristics field of the section header indicate
79707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton// characteristics of the section.
80707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_TYPE_NO_PAD               0x00000008 // The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files.
81707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_CNT_CODE                  0x00000020 // The section contains executable code.
82707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_CNT_INITIALIZED_DATA      0x00000040 // The section contains initialized data.
83707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_CNT_UNINITIALIZED_DATA    0x00000080 // The section contains uninitialized data.
84707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_OTHER                 0x00000100 // Reserved for future use.
85707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_INFO                  0x00000200 // The section contains comments or other information. The .drectve section has this type. This is valid for object files only.
86707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_REMOVE                0x00000800 // The section will not become part of the image. This is valid only for object files.
87707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_COMDAT                0x00001000 // The section contains COMDAT data. For more information, see section 5.5.6, “COMDAT Sections (Object Only).” This is valid only for object files.
88707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_GPREL                     0x00008000 // The section contains data referenced through the global pointer (GP).
89707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_PURGEABLE             0x00020000
90707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_16BIT                 0x00020000 // For ARM machine types, the section contains Thumb code.  Reserved for future use with other machine types.
91707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_LOCKED                0x00040000
92707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_PRELOAD               0x00080000
93707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_1BYTES              0x00100000 // Align data on a 1-byte boundary. Valid only for object files.
94707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_2BYTES              0x00200000 // Align data on a 2-byte boundary. Valid only for object files.
95707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_4BYTES              0x00300000 // Align data on a 4-byte boundary. Valid only for object files.
96707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_8BYTES              0x00400000 // Align data on an 8-byte boundary. Valid only for object files.
97707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_16BYTES             0x00500000 // Align data on a 16-byte boundary. Valid only for object files.
98707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_32BYTES             0x00600000 // Align data on a 32-byte boundary. Valid only for object files.
99707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_64BYTES             0x00700000 // Align data on a 64-byte boundary. Valid only for object files.
100707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_128BYTES            0x00800000 // Align data on a 128-byte boundary. Valid only for object files.
101707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_256BYTES            0x00900000 // Align data on a 256-byte boundary. Valid only for object files.
102707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_512BYTES            0x00A00000 // Align data on a 512-byte boundary. Valid only for object files.
103707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_1024BYTES           0x00B00000 // Align data on a 1024-byte boundary. Valid only for object files.
104707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_2048BYTES           0x00C00000 // Align data on a 2048-byte boundary. Valid only for object files.
105707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_4096BYTES           0x00D00000 // Align data on a 4096-byte boundary. Valid only for object files.
106707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_8192BYTES           0x00E00000 // Align data on an 8192-byte boundary. Valid only for object files.
107707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_NRELOC_OVFL           0x01000000 // The section contains extended relocations.
108707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_DISCARDABLE           0x02000000 // The section can be discarded as needed.
109707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_NOT_CACHED            0x04000000 // The section cannot be cached.
110707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_NOT_PAGED             0x08000000 // The section is not pageable.
111707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_SHARED                0x10000000 // The section can be shared in memory.
112707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_EXECUTE               0x20000000 // The section can be executed as code.
113707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_READ                  0x40000000 // The section can be read.
114707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_WRITE                 0x80000000 // The section can be written to.
115707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton
116e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonusing namespace lldb;
117e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonusing namespace lldb_private;
118e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
119e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
120e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::Initialize()
121e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
122e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
123e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                   GetPluginDescriptionStatic(),
124b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                   CreateInstance,
12536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                   CreateMemoryInstance,
12636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                   GetModuleSpecifications);
127e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
128e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
129e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
130e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::Terminate()
131e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
132e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    PluginManager::UnregisterPlugin (CreateInstance);
133e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
134e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
135e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
1360e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
137e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginNameStatic()
138e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
1390e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static ConstString g_name("pe-coff");
1400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return g_name;
141e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
142e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
143e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonconst char *
144e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginDescriptionStatic()
145e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
146e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return "Portable Executable and Common Object File Format object file reader (32 and 64 bit)";
147e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
148e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
149e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
150e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFile *
151cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFilePECOFF::CreateInstance (const lldb::ModuleSP &module_sp,
152cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                  DataBufferSP& data_sp,
153cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                  lldb::offset_t data_offset,
154cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                  const lldb_private::FileSpec* file,
155cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                  lldb::offset_t file_offset,
156cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                  lldb::offset_t length)
157e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
158cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    if (!data_sp)
159e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
160cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        data_sp = file->MemoryMapFileContents(file_offset, length);
161cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        data_offset = 0;
162cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    }
163cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton
164cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    if (ObjectFilePECOFF::MagicBytesMatch(data_sp))
165cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    {
166cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        // Update the data to contain the entire file if it doesn't already
167cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        if (data_sp->GetByteSize() < length)
168cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton            data_sp = file->MemoryMapFileContents(file_offset, length);
169102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton        std::unique_ptr<ObjectFile> objfile_ap(new ObjectFilePECOFF (module_sp, data_sp, data_offset, file, file_offset, length));
170e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        if (objfile_ap.get() && objfile_ap->ParseHeader())
171e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return objfile_ap.release();
172e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
173e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return NULL;
174e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
175e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
176b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile *
1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFilePECOFF::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
178b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                        lldb::DataBufferSP& data_sp,
179b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                        const lldb::ProcessSP &process_sp,
180b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                        lldb::addr_t header_addr)
181b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
182b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return NULL;
183b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
184b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
18536b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonsize_t
18636b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFilePECOFF::GetModuleSpecifications (const lldb_private::FileSpec& file,
18736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                           lldb::DataBufferSP& data_sp,
18836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                           lldb::offset_t data_offset,
18936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                           lldb::offset_t file_offset,
19036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                           lldb::offset_t length,
19136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                           lldb_private::ModuleSpecList &specs)
19236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{
19336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    return 0;
19436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton}
19536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
19636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
197e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
198cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFilePECOFF::MagicBytesMatch (DataBufferSP& data_sp)
199e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
200cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    DataExtractor data(data_sp, eByteOrderLittle, 4);
20136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t offset = 0;
202e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    uint16_t magic = data.GetU16 (&offset);
203e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return magic == IMAGE_DOS_SIGNATURE;
204e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
205e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
206e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
2073508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFilePECOFF::ObjectFilePECOFF (const lldb::ModuleSP &module_sp,
208cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                    DataBufferSP& data_sp,
209cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                    lldb::offset_t data_offset,
210e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                    const FileSpec* file,
211cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                    lldb::offset_t file_offset,
212cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                    lldb::offset_t length) :
213cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    ObjectFile (module_sp, file, file_offset, length, data_sp, data_offset),
214e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    m_dos_header (),
215e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    m_coff_header (),
216e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    m_coff_header_opt (),
217e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    m_sect_headers ()
218e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
219e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    ::memset (&m_dos_header, 0, sizeof(m_dos_header));
220e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    ::memset (&m_coff_header, 0, sizeof(m_coff_header));
221e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    ::memset (&m_coff_header_opt, 0, sizeof(m_coff_header_opt));
222e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
223e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
224e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
225e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::~ObjectFilePECOFF()
226e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
227e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
228e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
229e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
230e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
231e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::ParseHeader ()
232e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
2339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
2349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
235e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
2369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
2379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        m_sect_headers.clear();
2389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        m_data.SetByteOrder (eByteOrderLittle);
23936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
2409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
2419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (ParseDOSHeader())
242707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton        {
2439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = m_dos_header.e_lfanew;
2449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            uint32_t pe_signature = m_data.GetU32 (&offset);
2459482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (pe_signature != IMAGE_NT_SIGNATURE)
2469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                return false;
2479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (ParseCOFFHeader(&offset))
2489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            {
2499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (m_coff_header.hdrsize > 0)
2509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    ParseCOFFOptionalHeader(&offset);
2519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                ParseSectionHeaders (offset);
2529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
2539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            return true;
254707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton        }
255e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
256e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return false;
257e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
258e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
259e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
260e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonByteOrder
261e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetByteOrder () const
262e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
263e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return eByteOrderLittle;
264e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
265e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
266e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
267e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::IsExecutable() const
268e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
269e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return (m_coff_header.flags & IMAGE_FILE_DLL) == 0;
270e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
271e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
27236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonuint32_t
273e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetAddressByteSize () const
274e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
275e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (m_coff_header_opt.magic == OPT_HEADER_MAGIC_PE32_PLUS)
276e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        return 8;
277e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    else if (m_coff_header_opt.magic == OPT_HEADER_MAGIC_PE32)
278e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        return 4;
279e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return 4;
280e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
281e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
282e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
283e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// NeedsEndianSwap
284e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
285e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Return true if an endian swap needs to occur when extracting data
286e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// from this file.
287e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
288e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
289e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::NeedsEndianSwap() const
290e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
291e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#if defined(__LITTLE_ENDIAN__)
292e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return false;
293e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#else
294e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return true;
295e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#endif
296e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
297e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
298e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// ParseDOSHeader
299e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
300e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
301e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::ParseDOSHeader ()
302e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
303e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    bool success = false;
30436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t offset = 0;
305e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    success = m_data.ValidOffsetForDataOfSize(0, sizeof(m_dos_header));
306e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
307e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (success)
308e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
309e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_dos_header.e_magic = m_data.GetU16(&offset); // Magic number
310e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        success = m_dos_header.e_magic == IMAGE_DOS_SIGNATURE;
311e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
312e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        if (success)
313e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        {
314e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_cblp     = m_data.GetU16(&offset); // Bytes on last page of file
315e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_cp       = m_data.GetU16(&offset); // Pages in file
316e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_crlc     = m_data.GetU16(&offset); // Relocations
317e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_cparhdr  = m_data.GetU16(&offset); // Size of header in paragraphs
318e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_minalloc = m_data.GetU16(&offset); // Minimum extra paragraphs needed
319e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_maxalloc = m_data.GetU16(&offset); // Maximum extra paragraphs needed
320e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_ss       = m_data.GetU16(&offset); // Initial (relative) SS value
321e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_sp       = m_data.GetU16(&offset); // Initial SP value
322e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_csum     = m_data.GetU16(&offset); // Checksum
323e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_ip       = m_data.GetU16(&offset); // Initial IP value
324e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_cs       = m_data.GetU16(&offset); // Initial (relative) CS value
325e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_lfarlc   = m_data.GetU16(&offset); // File address of relocation table
326e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_ovno     = m_data.GetU16(&offset); // Overlay number
327e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
328e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res[0]   = m_data.GetU16(&offset); // Reserved words
329e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res[1]   = m_data.GetU16(&offset); // Reserved words
330e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res[2]   = m_data.GetU16(&offset); // Reserved words
331e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res[3]   = m_data.GetU16(&offset); // Reserved words
332e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
333e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_oemid    = m_data.GetU16(&offset); // OEM identifier (for e_oeminfo)
334e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_oeminfo  = m_data.GetU16(&offset); // OEM information; e_oemid specific
335e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[0]  = m_data.GetU16(&offset); // Reserved words
336e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[1]  = m_data.GetU16(&offset); // Reserved words
337e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[2]  = m_data.GetU16(&offset); // Reserved words
338e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[3]  = m_data.GetU16(&offset); // Reserved words
339e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[4]  = m_data.GetU16(&offset); // Reserved words
340e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[5]  = m_data.GetU16(&offset); // Reserved words
341e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[6]  = m_data.GetU16(&offset); // Reserved words
342e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[7]  = m_data.GetU16(&offset); // Reserved words
343e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[8]  = m_data.GetU16(&offset); // Reserved words
344e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_res2[9]  = m_data.GetU16(&offset); // Reserved words
345e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
346e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_dos_header.e_lfanew   = m_data.GetU32(&offset); // File address of new exe header
347e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        }
348e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
349e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (!success)
350e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        memset(&m_dos_header, 0, sizeof(m_dos_header));
351e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return success;
352e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
353e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
354e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
355e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
356e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// ParserCOFFHeader
357e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
358e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
35936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonObjectFilePECOFF::ParseCOFFHeader(lldb::offset_t *offset_ptr)
360e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
361e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    bool success = m_data.ValidOffsetForDataOfSize (*offset_ptr, sizeof(m_coff_header));
362e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (success)
363e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
364e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.machine   = m_data.GetU16(offset_ptr);
365e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.nsects    = m_data.GetU16(offset_ptr);
366e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.modtime   = m_data.GetU32(offset_ptr);
367e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.symoff    = m_data.GetU32(offset_ptr);
368e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.nsyms     = m_data.GetU32(offset_ptr);
369e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.hdrsize   = m_data.GetU16(offset_ptr);
370e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header.flags     = m_data.GetU16(offset_ptr);
371e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
372e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (!success)
373e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        memset(&m_coff_header, 0, sizeof(m_coff_header));
374e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return success;
375e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
376e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
377e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
37836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonObjectFilePECOFF::ParseCOFFOptionalHeader(lldb::offset_t *offset_ptr)
379e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
380e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    bool success = false;
38136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const lldb::offset_t end_offset = *offset_ptr + m_coff_header.hdrsize;
382e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (*offset_ptr < end_offset)
383e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
384e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        success = true;
385e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.magic                         = m_data.GetU16(offset_ptr);
386e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.major_linker_version          = m_data.GetU8 (offset_ptr);
387e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.minor_linker_version          = m_data.GetU8 (offset_ptr);
388e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.code_size                     = m_data.GetU32(offset_ptr);
389e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.data_size                     = m_data.GetU32(offset_ptr);
390e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.bss_size                      = m_data.GetU32(offset_ptr);
391e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.entry                         = m_data.GetU32(offset_ptr);
392e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        m_coff_header_opt.code_offset                   = m_data.GetU32(offset_ptr);
393e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
394e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        const uint32_t addr_byte_size = GetAddressByteSize ();
395e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
396e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        if (*offset_ptr < end_offset)
397e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        {
398e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            if (m_coff_header_opt.magic == OPT_HEADER_MAGIC_PE32)
399e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            {
400e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                // PE32 only
401e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.data_offset               = m_data.GetU32(offset_ptr);
402e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            }
403e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            else
404e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.data_offset = 0;
405e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
406e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            if (*offset_ptr < end_offset)
407e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            {
408e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.image_base                    = m_data.GetMaxU64 (offset_ptr, addr_byte_size);
409e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.sect_alignment                = m_data.GetU32(offset_ptr);
410e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.file_alignment                = m_data.GetU32(offset_ptr);
411e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.major_os_system_version       = m_data.GetU16(offset_ptr);
412e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.minor_os_system_version       = m_data.GetU16(offset_ptr);
413e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.major_image_version           = m_data.GetU16(offset_ptr);
414e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.minor_image_version           = m_data.GetU16(offset_ptr);
415e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.major_subsystem_version       = m_data.GetU16(offset_ptr);
416e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.minor_subsystem_version       = m_data.GetU16(offset_ptr);
417e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.reserved1                     = m_data.GetU32(offset_ptr);
418e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.image_size                    = m_data.GetU32(offset_ptr);
419e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.header_size                   = m_data.GetU32(offset_ptr);
420707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton                m_coff_header_opt.checksum                      = m_data.GetU32(offset_ptr);
421e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.subsystem                     = m_data.GetU16(offset_ptr);
422e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.dll_flags                     = m_data.GetU16(offset_ptr);
423e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.stack_reserve_size            = m_data.GetMaxU64 (offset_ptr, addr_byte_size);
424e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.stack_commit_size             = m_data.GetMaxU64 (offset_ptr, addr_byte_size);
425e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.heap_reserve_size             = m_data.GetMaxU64 (offset_ptr, addr_byte_size);
426e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.heap_commit_size              = m_data.GetMaxU64 (offset_ptr, addr_byte_size);
427e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.loader_flags                  = m_data.GetU32(offset_ptr);
428e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                uint32_t num_data_dir_entries = m_data.GetU32(offset_ptr);
429e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.data_dirs.clear();
430e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                m_coff_header_opt.data_dirs.resize(num_data_dir_entries);
431e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                uint32_t i;
432e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                for (i=0; i<num_data_dir_entries; i++)
433e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                {
434e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_coff_header_opt.data_dirs[i].vmaddr = m_data.GetU32(offset_ptr);
435e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_coff_header_opt.data_dirs[i].vmsize = m_data.GetU32(offset_ptr);
436e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                }
437e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            }
438e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        }
439e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
440e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    // Make sure we are on track for section data which follows
441e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    *offset_ptr = end_offset;
442e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return success;
443e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
444e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
445e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
446e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
447e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// ParseSectionHeaders
448e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
449e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
450e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::ParseSectionHeaders (uint32_t section_header_data_offset)
451e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
452e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    const uint32_t nsects = m_coff_header.nsects;
453e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    m_sect_headers.clear();
454e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
455e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (nsects > 0)
456e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
457e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        const uint32_t addr_byte_size = GetAddressByteSize ();
458e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        const size_t section_header_byte_size = nsects * sizeof(section_header_t);
459e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        DataBufferSP section_header_data_sp(m_file.ReadFileContents (section_header_data_offset, section_header_byte_size));
460e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        DataExtractor section_header_data (section_header_data_sp, GetByteOrder(), addr_byte_size);
461e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
46236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
463e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        if (section_header_data.ValidOffsetForDataOfSize (offset, section_header_byte_size))
464e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        {
465e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            m_sect_headers.resize(nsects);
466e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
467e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            for (uint32_t idx = 0; idx<nsects; ++idx)
468e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            {
469e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                const void *name_data = section_header_data.GetData(&offset, 8);
470e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                if (name_data)
471e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                {
472e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    memcpy(m_sect_headers[idx].name, name_data, 8);
473e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].vmsize  = section_header_data.GetU32(&offset);
474e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].vmaddr  = section_header_data.GetU32(&offset);
475e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].size    = section_header_data.GetU32(&offset);
476e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].offset  = section_header_data.GetU32(&offset);
477e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].reloff  = section_header_data.GetU32(&offset);
478e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].lineoff = section_header_data.GetU32(&offset);
479e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].nreloc  = section_header_data.GetU16(&offset);
480e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].nline   = section_header_data.GetU16(&offset);
481e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                    m_sect_headers[idx].flags   = section_header_data.GetU32(&offset);
482e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                }
483e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            }
484e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        }
485e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
486e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
487e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return m_sect_headers.empty() == false;
488e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
489e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
490e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
491e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetSectionName(std::string& sect_name, const section_header_t& sect)
492e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
493e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (sect.name[0] == '/')
494e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
49536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t stroff = strtoul(&sect.name[1], NULL, 10);
49636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t string_file_offset = m_coff_header.symoff + (m_coff_header.nsyms * 18) + stroff;
497e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        const char *name = m_data.GetCStr (&string_file_offset);
498e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        if (name)
499e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        {
500e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            sect_name = name;
501e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return true;
502e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        }
503e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
504e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        return false;
505e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
506e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    sect_name = sect.name;
507e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return true;
508e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
509e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
510e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
511e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// GetNListSymtab
512e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
513e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonSymtab *
5147940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFilePECOFF::GetSymtab()
515e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
5169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
5179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
518e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
5199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
5209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_symtab_ap.get() == NULL)
521e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        {
5229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            SectionList *sect_list = GetSectionList();
5239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap.reset(new Symtab(this));
5249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            Mutex::Locker symtab_locker (m_symtab_ap->GetMutex());
5259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
5269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t num_syms = m_coff_header.nsyms;
5279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
5289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (num_syms > 0 && m_coff_header.symoff > 0)
529e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            {
5302856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                const uint32_t symbol_size = 18;
5319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const uint32_t addr_byte_size = GetAddressByteSize ();
5329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const size_t symbol_data_size = num_syms * symbol_size;
5339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                // Include the 4 bytes string table size at the end of the symbols
5349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                DataBufferSP symtab_data_sp(m_file.ReadFileContents (m_coff_header.symoff, symbol_data_size + 4));
5359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                DataExtractor symtab_data (symtab_data_sp, GetByteOrder(), addr_byte_size);
53636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                lldb::offset_t offset = symbol_data_size;
5379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const uint32_t strtab_size = symtab_data.GetU32 (&offset);
5382856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                DataBufferSP strtab_data_sp(m_file.ReadFileContents (m_coff_header.symoff + symbol_data_size, strtab_size));
5399482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                DataExtractor strtab_data (strtab_data_sp, GetByteOrder(), addr_byte_size);
5409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
5412856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                // First 4 bytes should be zeroed after strtab_size has been read,
5422856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                // because it is used as offset 0 to encode a NULL string.
5432856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                uint32_t* strtab_data_start = (uint32_t*)strtab_data_sp->GetBytes();
5442856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                strtab_data_start[0] = 0;
5452856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton
5469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                offset = 0;
5479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                std::string symbol_name;
5489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                Symbol *symbols = m_symtab_ap->Resize (num_syms);
5499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                for (uint32_t i=0; i<num_syms; ++i)
550707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton                {
5519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    coff_symbol_t symbol;
5529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    const uint32_t symbol_offset = offset;
5539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    const char *symbol_name_cstr = NULL;
5549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // If the first 4 bytes of the symbol string are zero, then we
5559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // it is followed by a 4 byte string table offset. Else these
5569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // 8 bytes contain the symbol name
5579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (symtab_data.GetU32 (&offset) == 0)
5589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
5599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // Long string that doesn't fit into the symbol table name,
5609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // so now we must read the 4 byte string table offset
5619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        uint32_t strtab_offset = symtab_data.GetU32 (&offset);
5629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        symbol_name_cstr = strtab_data.PeekCStr (strtab_offset);
5639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        symbol_name.assign (symbol_name_cstr);
5649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
5659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    else
5669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
5679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // Short string that fits into the symbol table name which is 8 bytes
5689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        offset += sizeof(symbol.name) - 4; // Skip remaining
5699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        symbol_name_cstr = symtab_data.PeekCStr (symbol_offset);
5709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (symbol_name_cstr == NULL)
5719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            break;
5729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        symbol_name.assign (symbol_name_cstr, sizeof(symbol.name));
5739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
5749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    symbol.value    = symtab_data.GetU32 (&offset);
5759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    symbol.sect     = symtab_data.GetU16 (&offset);
5769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    symbol.type     = symtab_data.GetU16 (&offset);
5779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    symbol.storage  = symtab_data.GetU8  (&offset);
5789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    symbol.naux     = symtab_data.GetU8  (&offset);
579c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                    symbols[i].GetMangled ().SetValue (ConstString(symbol_name.c_str()));
5802856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                    if ((int16_t)symbol.sect >= 1)
5812856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                    {
5822856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                        Address symbol_addr(sect_list->GetSectionAtIndex(symbol.sect-1), symbol.value);
5832856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                        symbols[i].GetAddress() = symbol_addr;
5842856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                    }
5859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
5869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (symbol.naux > 0)
5872856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                    {
5889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        i += symbol.naux;
5892856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                        offset += symbol_size;
5902856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                    }
591707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton                }
5929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
593e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            }
594e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        }
595e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
596e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return m_symtab_ap.get();
597e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
598e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
599e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
6007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonbool
6017940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFilePECOFF::IsStripped ()
602e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
6037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    // TODO: determine this for COFF
6047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    return false;
6057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton}
6067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
6077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
6087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
6097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonvoid
6107940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFilePECOFF::CreateSections (SectionList &unified_section_list)
6117940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton{
6127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    if (!m_sections_ap.get())
613e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
6147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        m_sections_ap.reset(new SectionList());
6157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
6167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        ModuleSP module_sp(GetModule());
6177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        if (module_sp)
618e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        {
6197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            lldb_private::Mutex::Locker locker(module_sp->GetMutex());
6209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t nsects = m_sect_headers.size();
6219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ModuleSP module_sp (GetModule());
6229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            for (uint32_t idx = 0; idx<nsects; ++idx)
623707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton            {
6249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                std::string sect_name;
6259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                GetSectionName (sect_name, m_sect_headers[idx]);
6269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                ConstString const_sect_name (sect_name.c_str());
6279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_code_sect_name (".code");
6289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_CODE_sect_name ("CODE");
6299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_data_sect_name (".data");
6309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_DATA_sect_name ("DATA");
6319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_bss_sect_name (".bss");
6329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_BSS_sect_name ("BSS");
6339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_debug_sect_name (".debug");
6349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_reloc_sect_name (".reloc");
6359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_stab_sect_name (".stab");
6369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                static ConstString g_stabstr_sect_name (".stabstr");
6372856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev");
6382856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges");
6392856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_frame (".debug_frame");
6402856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_info (".debug_info");
6412856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_line (".debug_line");
6422856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_loc (".debug_loc");
6432856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo");
6442856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames");
6452856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes");
6462856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges");
6472856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_dwarf_debug_str (".debug_str");
6482856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                static ConstString g_sect_name_eh_frame (".eh_frame");
6499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                SectionType section_type = eSectionTypeOther;
6509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_CODE &&
6519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    ((const_sect_name == g_code_sect_name) || (const_sect_name == g_CODE_sect_name)))
6529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
6539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    section_type = eSectionTypeCode;
6549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_INITIALIZED_DATA &&
6569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                         ((const_sect_name == g_data_sect_name) || (const_sect_name == g_DATA_sect_name)))
6579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
658707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton                    section_type = eSectionTypeData;
6599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
6619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                         ((const_sect_name == g_bss_sect_name) || (const_sect_name == g_BSS_sect_name)))
6629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
6639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (m_sect_headers[idx].size == 0)
6649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        section_type = eSectionTypeZeroFill;
6659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    else
6669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        section_type = eSectionTypeData;
6679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (const_sect_name == g_debug_sect_name)
6699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
6709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    section_type = eSectionTypeDebug;
6719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (const_sect_name == g_stabstr_sect_name)
6739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
6749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    section_type = eSectionTypeDataCString;
6759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (const_sect_name == g_reloc_sect_name)
6779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
6789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    section_type = eSectionTypeOther;
6799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6802856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_abbrev)    section_type = eSectionTypeDWARFDebugAbbrev;
6812856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_aranges)   section_type = eSectionTypeDWARFDebugAranges;
6822856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_frame)     section_type = eSectionTypeDWARFDebugFrame;
6832856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_info)      section_type = eSectionTypeDWARFDebugInfo;
6842856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_line)      section_type = eSectionTypeDWARFDebugLine;
6852856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_loc)       section_type = eSectionTypeDWARFDebugLoc;
6862856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_macinfo)   section_type = eSectionTypeDWARFDebugMacInfo;
6872856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_pubnames)  section_type = eSectionTypeDWARFDebugPubNames;
6882856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_pubtypes)  section_type = eSectionTypeDWARFDebugPubTypes;
6892856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_ranges)    section_type = eSectionTypeDWARFDebugRanges;
6902856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_dwarf_debug_str)       section_type = eSectionTypeDWARFDebugStr;
6912856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                else if (const_sect_name == g_sect_name_eh_frame)              section_type = eSectionTypeEHFrame;
6929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_CODE)
6939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
6949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    section_type = eSectionTypeCode;
6959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
6969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_INITIALIZED_DATA)
6979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
698707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton                    section_type = eSectionTypeData;
6999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
7009482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
7019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
7029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (m_sect_headers[idx].size == 0)
7039482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        section_type = eSectionTypeZeroFill;
7049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    else
7059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        section_type = eSectionTypeData;
7069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
707707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton
7089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                // Use a segment ID of the segment index shifted left by 8 so they
7099482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                // never conflict with any of the sections.
7109482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                SectionSP section_sp (new Section (module_sp,                    // Module to which this section belongs
711a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                                                   this,                         // Object file to which this section belongs
7129482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                                                   idx + 1,                      // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible
7139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                                                   const_sect_name,              // Name of this section
714a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                                                   section_type,                 // This section is a container of other sections.
7152856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton                                                   m_coff_header_opt.image_base + m_sect_headers[idx].vmaddr,   // File VM address == addresses as they are found in the object file
7169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                                                   m_sect_headers[idx].vmsize,   // VM size in bytes of this section
7179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                                                   m_sect_headers[idx].offset,   // Offset to the data for this section in the file
7189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                                                   m_sect_headers[idx].size,     // Size in bytes of this section as found in the the file
7199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                                                   m_sect_headers[idx].flags));  // Flags for this section
7209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                //section_sp->SetIsEncrypted (segment_is_encrypted);
7229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                unified_section_list.AddSection(section_sp);
7247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                m_sections_ap->AddSection (section_sp);
7259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
726e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        }
727e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
728e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
729e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
730e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
731e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetUUID (UUID* uuid)
732e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
733e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return false;
734e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
735e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
736e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonuint32_t
737e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetDependentModules (FileSpecList& files)
738e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
739e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return 0;
740e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
741e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
742e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
743e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
744e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump
745e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
746e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the specifics of the runtime file container (such as any headers
747e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// segments, sections, etc).
748e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
749e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
750e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::Dump(Stream *s)
751e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
7529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
7539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
754e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
7559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
7569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->Printf("%p: ", this);
7579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->Indent();
7589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->PutCString("ObjectFilePECOFF");
7599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        ArchSpec header_arch;
7619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        GetArchitecture (header_arch);
7629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n";
7649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        SectionList *sections = GetSectionList();
7667940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        if (sections)
7677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            sections->Dump(s, NULL, true, UINT32_MAX);
7689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_symtab_ap.get())
7709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap->Dump(s, NULL, eSortOrderNone);
7719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_dos_header.e_magic)
7739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            DumpDOSHeader (s, m_dos_header);
7749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_coff_header.machine)
7759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
7769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            DumpCOFFHeader (s, m_coff_header);
7779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_coff_header.hdrsize)
7789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                DumpOptCOFFHeader (s, m_coff_header_opt);
7799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
7809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->EOL();
7819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        DumpSectionHeaders(s);
7829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->EOL();
783e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
784e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
785e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
786e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
787e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpDOSHeader
788e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
789e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the MS-DOS header to the specified output stream
790e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
791e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
792e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpDOSHeader(Stream *s, const dos_header_t& header)
793e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
794e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->PutCString ("MSDOS Header\n");
795e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_magic    = 0x%4.4x\n", header.e_magic);
796e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_cblp     = 0x%4.4x\n", header.e_cblp);
797e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_cp       = 0x%4.4x\n", header.e_cp);
798e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_crlc     = 0x%4.4x\n", header.e_crlc);
799e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_cparhdr  = 0x%4.4x\n", header.e_cparhdr);
800e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_minalloc = 0x%4.4x\n", header.e_minalloc);
801e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_maxalloc = 0x%4.4x\n", header.e_maxalloc);
802e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_ss       = 0x%4.4x\n", header.e_ss);
803e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_sp       = 0x%4.4x\n", header.e_sp);
804e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_csum     = 0x%4.4x\n", header.e_csum);
805e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_ip       = 0x%4.4x\n", header.e_ip);
806e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_cs       = 0x%4.4x\n", header.e_cs);
807e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_lfarlc   = 0x%4.4x\n", header.e_lfarlc);
808e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_ovno     = 0x%4.4x\n", header.e_ovno);
809e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_res[4]   = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
810e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res[0],
811e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res[1],
812e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res[2],
813e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res[3]);
814e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_oemid    = 0x%4.4x\n", header.e_oemid);
815e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_oeminfo  = 0x%4.4x\n", header.e_oeminfo);
816e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
817e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[0],
818e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[1],
819e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[2],
820e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[3],
821e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[4],
822e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[5],
823e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[6],
824e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[7],
825e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[8],
826e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               header.e_res2[9]);
827e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  e_lfanew   = 0x%8.8x\n", header.e_lfanew);
828e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
829e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
830e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
831e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpCOFFHeader
832e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
833e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the COFF header to the specified output stream
834e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
835e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
836e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpCOFFHeader(Stream *s, const coff_header_t& header)
837e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
838e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->PutCString ("COFF Header\n");
839e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  machine = 0x%4.4x\n", header.machine);
840e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  nsects  = 0x%4.4x\n", header.nsects);
841e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  modtime = 0x%8.8x\n", header.modtime);
842e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  symoff  = 0x%8.8x\n", header.symoff);
843e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  nsyms   = 0x%8.8x\n", header.nsyms);
844e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  hdrsize = 0x%4.4x\n", header.hdrsize);
845e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
846e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
847e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
848e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpOptCOFFHeader
849e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
850e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the optional COFF header to the specified output stream
851e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
852e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
853e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpOptCOFFHeader(Stream *s, const coff_opt_header_t& header)
854e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
855e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->PutCString ("Optional COFF Header\n");
856e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  magic                   = 0x%4.4x\n", header.magic);
857e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  major_linker_version    = 0x%2.2x\n", header.major_linker_version);
858e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  minor_linker_version    = 0x%2.2x\n", header.minor_linker_version);
859e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  code_size               = 0x%8.8x\n", header.code_size);
860e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  data_size               = 0x%8.8x\n", header.data_size);
861e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  bss_size                = 0x%8.8x\n", header.bss_size);
862e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  entry                   = 0x%8.8x\n", header.entry);
863e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  code_offset             = 0x%8.8x\n", header.code_offset);
864e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  data_offset             = 0x%8.8x\n", header.data_offset);
8655f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf ("  image_base              = 0x%16.16" PRIx64 "\n", header.image_base);
866e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  sect_alignment          = 0x%8.8x\n", header.sect_alignment);
867e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  file_alignment          = 0x%8.8x\n", header.file_alignment);
868e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  major_os_system_version = 0x%4.4x\n", header.major_os_system_version);
869e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  minor_os_system_version = 0x%4.4x\n", header.minor_os_system_version);
870e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  major_image_version     = 0x%4.4x\n", header.major_image_version);
871e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  minor_image_version     = 0x%4.4x\n", header.minor_image_version);
872e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  major_subsystem_version = 0x%4.4x\n", header.major_subsystem_version);
873e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  minor_subsystem_version = 0x%4.4x\n", header.minor_subsystem_version);
874e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  reserved1               = 0x%8.8x\n", header.reserved1);
875e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  image_size              = 0x%8.8x\n", header.image_size);
876e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  header_size             = 0x%8.8x\n", header.header_size);
877707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton    s->Printf ("  checksum                = 0x%8.8x\n", header.checksum);
878e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  subsystem               = 0x%4.4x\n", header.subsystem);
879e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  dll_flags               = 0x%4.4x\n", header.dll_flags);
8805f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf ("  stack_reserve_size      = 0x%16.16" PRIx64 "\n", header.stack_reserve_size);
8815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf ("  stack_commit_size       = 0x%16.16" PRIx64 "\n", header.stack_commit_size);
8825f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf ("  heap_reserve_size       = 0x%16.16" PRIx64 "\n", header.heap_reserve_size);
8835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    s->Printf ("  heap_commit_size        = 0x%16.16" PRIx64 "\n", header.heap_commit_size);
884e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  loader_flags            = 0x%8.8x\n", header.loader_flags);
885e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("  num_data_dir_entries    = 0x%8.8zx\n", header.data_dirs.size());
886e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    uint32_t i;
887e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    for (i=0; i<header.data_dirs.size(); i++)
888e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
889707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton        s->Printf ("  data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n",
890e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                   i,
891e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                   header.data_dirs[i].vmaddr,
892e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                   header.data_dirs[i].vmsize);
893e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
894e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
895e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
896e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpSectionHeader
897e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
898e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump a single ELF section header to the specified output stream
899e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
900e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
901e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpSectionHeader(Stream *s, const section_header_t& sh)
902e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
903e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    std::string name;
904e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    GetSectionName(name, sh);
905e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->Printf ("%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x 0x%4.4x 0x%8.8x\n",
906e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               name.c_str(),
907e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.vmaddr,
908707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton               sh.vmsize,
909e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.offset,
910707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton               sh.size,
911e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.reloff,
912e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.lineoff,
913e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.nreloc,
914e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.nline,
915e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton               sh.flags);
916e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
917e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
918e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
919e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
920e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpSectionHeaders
921e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//
922e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump all of the ELF section header to the specified output stream
923e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//----------------------------------------------------------------------
924e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid
925e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpSectionHeaders(Stream *s)
926e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
927e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
928e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    s->PutCString ("Section Headers\n");
929707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton    s->PutCString ("IDX  name             vm addr    vm size    file off   file size  reloc off  line off   nreloc nline  flags\n");
930707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton    s->PutCString ("==== ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ------ ------ ----------\n");
931e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
932e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    uint32_t idx = 0;
933e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    SectionHeaderCollIter pos, end = m_sect_headers.end();
934e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
935e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    for (pos = m_sect_headers.begin(); pos != end; ++pos, ++idx)
936e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
937707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton        s->Printf ("[%2u] ", idx);
938e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        ObjectFilePECOFF::DumpSectionHeader(s, *pos);
939e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
940e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
941e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
942e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonstatic bool
943e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonCOFFMachineToMachCPU (uint16_t machine, ArchSpec &arch)
944e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
945e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    switch (machine)
946e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
947e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_AMD64:
948e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_IA64:
949e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            arch.SetArchitecture (eArchTypeMachO,
950e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUTypeX86_64,
951e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUSubType_X86_64_ALL);
952e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return true;
953e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
954e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_I386:
955e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            arch.SetArchitecture (eArchTypeMachO,
956e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUTypeI386,
957e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUSubType_I386_ALL);
958e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return true;
959e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
960e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_POWERPC:
961e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_POWERPCFP:
962e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            arch.SetArchitecture (eArchTypeMachO,
963e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUTypePowerPC,
964e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUSubType_POWERPC_ALL);
965e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return true;
966e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_ARM:
967e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        case IMAGE_FILE_MACHINE_THUMB:
968e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            arch.SetArchitecture (eArchTypeMachO,
969e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUTypeARM,
970e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton                                  llvm::MachO::CPUSubType_ARM_V7);
971e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return true;
972e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
973e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return false;
974e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
975e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool
976e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetArchitecture (ArchSpec &arch)
977e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
978e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    // For index zero return our cpu type
979e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return COFFMachineToMachCPU (m_coff_header.machine, arch);
980e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
981e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
982e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFile::Type
983e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::CalculateType()
984e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
985e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    if (m_coff_header.machine != 0)
986e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    {
987e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        if ((m_coff_header.flags & IMAGE_FILE_DLL) == 0)
988e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return eTypeExecutable;
989e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton        else
990e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton            return eTypeSharedLibrary;
991e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    }
992e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return eTypeExecutable;
993e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
994e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
995e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFile::Strata
996e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::CalculateStrata()
997e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
998e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return eStrataUser;
999e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
1000e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//------------------------------------------------------------------
1001e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// PluginInterface protocol
1002e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//------------------------------------------------------------------
10030e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString
1004e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginName()
1005e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
1006e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return GetPluginNameStatic();
1007e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
1008e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
1009e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonuint32_t
1010e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginVersion()
1011e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{
1012e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton    return 1;
1013e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton}
1014e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton
1015