ObjectFileMachO.cpp revision 811b9c568bb0127f09a6cdd94842586eebf25d02
1//===-- ObjectFileMachO.cpp -------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Support/MachO.h"
11
12#include "ObjectFileMachO.h"
13
14#include "lldb/Core/ArchSpec.h"
15#include "lldb/Core/DataBuffer.h"
16#include "lldb/Host/FileSpec.h"
17#include "lldb/Core/FileSpecList.h"
18#include "lldb/Core/Module.h"
19#include "lldb/Core/PluginManager.h"
20#include "lldb/Core/Section.h"
21#include "lldb/Core/StreamFile.h"
22#include "lldb/Core/StreamString.h"
23#include "lldb/Core/Timer.h"
24#include "lldb/Core/UUID.h"
25#include "lldb/Symbol/ObjectFile.h"
26
27
28using namespace lldb;
29using namespace lldb_private;
30using namespace llvm::MachO;
31
32#define MACHO_NLIST_ARM_SYMBOL_IS_THUMB 0x0008
33
34void
35ObjectFileMachO::Initialize()
36{
37    PluginManager::RegisterPlugin (GetPluginNameStatic(),
38                                   GetPluginDescriptionStatic(),
39                                   CreateInstance);
40}
41
42void
43ObjectFileMachO::Terminate()
44{
45    PluginManager::UnregisterPlugin (CreateInstance);
46}
47
48
49const char *
50ObjectFileMachO::GetPluginNameStatic()
51{
52    return "object-file.mach-o";
53}
54
55const char *
56ObjectFileMachO::GetPluginDescriptionStatic()
57{
58    return "Mach-o object file reader (32 and 64 bit)";
59}
60
61
62ObjectFile *
63ObjectFileMachO::CreateInstance (Module* module, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length)
64{
65    if (ObjectFileMachO::MagicBytesMatch(dataSP))
66    {
67        std::auto_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module, dataSP, file, offset, length));
68        if (objfile_ap.get() && objfile_ap->ParseHeader())
69            return objfile_ap.release();
70    }
71    return NULL;
72}
73
74
75static uint32_t
76MachHeaderSizeFromMagic(uint32_t magic)
77{
78    switch (magic)
79    {
80    case HeaderMagic32:
81    case HeaderMagic32Swapped:
82        return sizeof(struct mach_header);
83
84    case HeaderMagic64:
85    case HeaderMagic64Swapped:
86        return sizeof(struct mach_header_64);
87        break;
88
89    default:
90        break;
91    }
92    return 0;
93}
94
95
96bool
97ObjectFileMachO::MagicBytesMatch (DataBufferSP& dataSP)
98{
99    DataExtractor data(dataSP, lldb::endian::InlHostByteOrder(), 4);
100    uint32_t offset = 0;
101    uint32_t magic = data.GetU32(&offset);
102    return MachHeaderSizeFromMagic(magic) != 0;
103}
104
105
106ObjectFileMachO::ObjectFileMachO(Module* module, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length) :
107    ObjectFile(module, file, offset, length, dataSP),
108    m_mutex (Mutex::eMutexTypeRecursive),
109    m_header(),
110    m_sections_ap(),
111    m_symtab_ap(),
112    m_entry_point_address ()
113{
114    ::memset (&m_header, 0, sizeof(m_header));
115    ::memset (&m_dysymtab, 0, sizeof(m_dysymtab));
116}
117
118
119ObjectFileMachO::~ObjectFileMachO()
120{
121}
122
123
124bool
125ObjectFileMachO::ParseHeader ()
126{
127    lldb_private::Mutex::Locker locker(m_mutex);
128    bool can_parse = false;
129    uint32_t offset = 0;
130    m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
131    // Leave magic in the original byte order
132    m_header.magic = m_data.GetU32(&offset);
133    switch (m_header.magic)
134    {
135    case HeaderMagic32:
136        m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
137        m_data.SetAddressByteSize(4);
138        can_parse = true;
139        break;
140
141    case HeaderMagic64:
142        m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
143        m_data.SetAddressByteSize(8);
144        can_parse = true;
145        break;
146
147    case HeaderMagic32Swapped:
148        m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
149        m_data.SetAddressByteSize(4);
150        can_parse = true;
151        break;
152
153    case HeaderMagic64Swapped:
154        m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
155        m_data.SetAddressByteSize(8);
156        can_parse = true;
157        break;
158
159    default:
160        break;
161    }
162
163    if (can_parse)
164    {
165        m_data.GetU32(&offset, &m_header.cputype, 6);
166
167        ArchSpec mach_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
168
169        if (SetModulesArchitecture (mach_arch))
170        {
171            // Read in all only the load command data
172            DataBufferSP data_sp(m_file.ReadFileContents(m_offset, m_header.sizeofcmds + MachHeaderSizeFromMagic(m_header.magic)));
173            m_data.SetData (data_sp);
174            return true;
175        }
176    }
177    else
178    {
179        memset(&m_header, 0, sizeof(struct mach_header));
180    }
181    return false;
182}
183
184
185ByteOrder
186ObjectFileMachO::GetByteOrder () const
187{
188    lldb_private::Mutex::Locker locker(m_mutex);
189    return m_data.GetByteOrder ();
190}
191
192bool
193ObjectFileMachO::IsExecutable() const
194{
195    return m_header.filetype == HeaderFileTypeExecutable;
196}
197
198size_t
199ObjectFileMachO::GetAddressByteSize () const
200{
201    lldb_private::Mutex::Locker locker(m_mutex);
202    return m_data.GetAddressByteSize ();
203}
204
205AddressClass
206ObjectFileMachO::GetAddressClass (lldb::addr_t file_addr)
207{
208    Symtab *symtab = GetSymtab();
209    if (symtab)
210    {
211        Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
212        if (symbol)
213        {
214            const AddressRange *range_ptr = symbol->GetAddressRangePtr();
215            if (range_ptr)
216            {
217                const Section *section = range_ptr->GetBaseAddress().GetSection();
218                if (section)
219                {
220                    const SectionType section_type = section->GetType();
221                    switch (section_type)
222                    {
223                    case eSectionTypeInvalid:               return eAddressClassUnknown;
224                    case eSectionTypeCode:
225                        if (m_header.cputype == llvm::MachO::CPUTypeARM)
226                        {
227                            // For ARM we have a bit in the n_desc field of the symbol
228                            // that tells us ARM/Thumb which is bit 0x0008.
229                            if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
230                                return eAddressClassCodeAlternateISA;
231                        }
232                        return eAddressClassCode;
233
234                    case eSectionTypeContainer:             return eAddressClassUnknown;
235                    case eSectionTypeData:                  return eAddressClassData;
236                    case eSectionTypeDataCString:           return eAddressClassData;
237                    case eSectionTypeDataCStringPointers:   return eAddressClassData;
238                    case eSectionTypeDataSymbolAddress:     return eAddressClassData;
239                    case eSectionTypeData4:                 return eAddressClassData;
240                    case eSectionTypeData8:                 return eAddressClassData;
241                    case eSectionTypeData16:                return eAddressClassData;
242                    case eSectionTypeDataPointers:          return eAddressClassData;
243                    case eSectionTypeZeroFill:              return eAddressClassData;
244                    case eSectionTypeDataObjCMessageRefs:   return eAddressClassData;
245                    case eSectionTypeDataObjCCFStrings:     return eAddressClassData;
246                    case eSectionTypeDebug:                 return eAddressClassDebug;
247                    case eSectionTypeDWARFDebugAbbrev:      return eAddressClassDebug;
248                    case eSectionTypeDWARFDebugAranges:     return eAddressClassDebug;
249                    case eSectionTypeDWARFDebugFrame:       return eAddressClassDebug;
250                    case eSectionTypeDWARFDebugInfo:        return eAddressClassDebug;
251                    case eSectionTypeDWARFDebugLine:        return eAddressClassDebug;
252                    case eSectionTypeDWARFDebugLoc:         return eAddressClassDebug;
253                    case eSectionTypeDWARFDebugMacInfo:     return eAddressClassDebug;
254                    case eSectionTypeDWARFDebugPubNames:    return eAddressClassDebug;
255                    case eSectionTypeDWARFDebugPubTypes:    return eAddressClassDebug;
256                    case eSectionTypeDWARFDebugRanges:      return eAddressClassDebug;
257                    case eSectionTypeDWARFDebugStr:         return eAddressClassDebug;
258                    case eSectionTypeEHFrame:               return eAddressClassRuntime;
259                    case eSectionTypeOther:                 return eAddressClassUnknown;
260                    }
261                }
262            }
263
264            const SymbolType symbol_type = symbol->GetType();
265            switch (symbol_type)
266            {
267            case eSymbolTypeAny:            return eAddressClassUnknown;
268            case eSymbolTypeAbsolute:       return eAddressClassUnknown;
269            case eSymbolTypeExtern:         return eAddressClassUnknown;
270
271            case eSymbolTypeCode:
272            case eSymbolTypeTrampoline:
273                if (m_header.cputype == llvm::MachO::CPUTypeARM)
274                {
275                    // For ARM we have a bit in the n_desc field of the symbol
276                    // that tells us ARM/Thumb which is bit 0x0008.
277                    if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
278                        return eAddressClassCodeAlternateISA;
279                }
280                return eAddressClassCode;
281
282            case eSymbolTypeData:           return eAddressClassData;
283            case eSymbolTypeRuntime:        return eAddressClassRuntime;
284            case eSymbolTypeException:      return eAddressClassRuntime;
285            case eSymbolTypeSourceFile:     return eAddressClassDebug;
286            case eSymbolTypeHeaderFile:     return eAddressClassDebug;
287            case eSymbolTypeObjectFile:     return eAddressClassDebug;
288            case eSymbolTypeCommonBlock:    return eAddressClassDebug;
289            case eSymbolTypeBlock:          return eAddressClassDebug;
290            case eSymbolTypeLocal:          return eAddressClassData;
291            case eSymbolTypeParam:          return eAddressClassData;
292            case eSymbolTypeVariable:       return eAddressClassData;
293            case eSymbolTypeVariableType:   return eAddressClassDebug;
294            case eSymbolTypeLineEntry:      return eAddressClassDebug;
295            case eSymbolTypeLineHeader:     return eAddressClassDebug;
296            case eSymbolTypeScopeBegin:     return eAddressClassDebug;
297            case eSymbolTypeScopeEnd:       return eAddressClassDebug;
298            case eSymbolTypeAdditional:     return eAddressClassUnknown;
299            case eSymbolTypeCompiler:       return eAddressClassDebug;
300            case eSymbolTypeInstrumentation:return eAddressClassDebug;
301            case eSymbolTypeUndefined:      return eAddressClassUnknown;
302            }
303        }
304    }
305    return eAddressClassUnknown;
306}
307
308Symtab *
309ObjectFileMachO::GetSymtab()
310{
311    lldb_private::Mutex::Locker symfile_locker(m_mutex);
312    if (m_symtab_ap.get() == NULL)
313    {
314        m_symtab_ap.reset(new Symtab(this));
315        Mutex::Locker symtab_locker (m_symtab_ap->GetMutex());
316        ParseSymtab (true);
317    }
318    return m_symtab_ap.get();
319}
320
321
322SectionList *
323ObjectFileMachO::GetSectionList()
324{
325    lldb_private::Mutex::Locker locker(m_mutex);
326    if (m_sections_ap.get() == NULL)
327    {
328        m_sections_ap.reset(new SectionList());
329        ParseSections();
330    }
331    return m_sections_ap.get();
332}
333
334
335size_t
336ObjectFileMachO::ParseSections ()
337{
338    lldb::user_id_t segID = 0;
339    lldb::user_id_t sectID = 0;
340    struct segment_command_64 load_cmd;
341    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
342    uint32_t i;
343    //bool dump_sections = false;
344    for (i=0; i<m_header.ncmds; ++i)
345    {
346        const uint32_t load_cmd_offset = offset;
347        if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
348            break;
349
350        if (load_cmd.cmd == LoadCommandSegment32 || load_cmd.cmd == LoadCommandSegment64)
351        {
352            if (m_data.GetU8(&offset, (uint8_t*)load_cmd.segname, 16))
353            {
354                load_cmd.vmaddr = m_data.GetAddress(&offset);
355                load_cmd.vmsize = m_data.GetAddress(&offset);
356                load_cmd.fileoff = m_data.GetAddress(&offset);
357                load_cmd.filesize = m_data.GetAddress(&offset);
358                if (m_data.GetU32(&offset, &load_cmd.maxprot, 4))
359                {
360
361                    const bool segment_is_encrypted = (load_cmd.flags & SegmentCommandFlagBitProtectedVersion1) != 0;
362
363                    // Keep a list of mach segments around in case we need to
364                    // get at data that isn't stored in the abstracted Sections.
365                    m_mach_segments.push_back (load_cmd);
366
367                    ConstString segment_name (load_cmd.segname, std::min<int>(strlen(load_cmd.segname), sizeof(load_cmd.segname)));
368                    // Use a segment ID of the segment index shifted left by 8 so they
369                    // never conflict with any of the sections.
370                    SectionSP segment_sp;
371                    if (segment_name)
372                    {
373                        segment_sp.reset(new Section (NULL,
374                                                      GetModule(),            // Module to which this section belongs
375                                                      ++segID << 8,           // 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
376                                                      segment_name,           // Name of this section
377                                                      eSectionTypeContainer,  // This section is a container of other sections.
378                                                      load_cmd.vmaddr,        // File VM address == addresses as they are found in the object file
379                                                      load_cmd.vmsize,        // VM size in bytes of this section
380                                                      load_cmd.fileoff,       // Offset to the data for this section in the file
381                                                      load_cmd.filesize,      // Size in bytes of this section as found in the the file
382                                                      load_cmd.flags));       // Flags for this section
383
384                        segment_sp->SetIsEncrypted (segment_is_encrypted);
385                        m_sections_ap->AddSection(segment_sp);
386                    }
387
388                    struct section_64 sect64;
389                    ::memset (&sect64, 0, sizeof(sect64));
390                    // Push a section into our mach sections for the section at
391                    // index zero (NListSectionNoSection) if we don't have any
392                    // mach sections yet...
393                    if (m_mach_sections.empty())
394                        m_mach_sections.push_back(sect64);
395                    uint32_t segment_sect_idx;
396                    const lldb::user_id_t first_segment_sectID = sectID + 1;
397
398
399                    const uint32_t num_u32s = load_cmd.cmd == LoadCommandSegment32 ? 7 : 8;
400                    for (segment_sect_idx=0; segment_sect_idx<load_cmd.nsects; ++segment_sect_idx)
401                    {
402                        if (m_data.GetU8(&offset, (uint8_t*)sect64.sectname, sizeof(sect64.sectname)) == NULL)
403                            break;
404                        if (m_data.GetU8(&offset, (uint8_t*)sect64.segname, sizeof(sect64.segname)) == NULL)
405                            break;
406                        sect64.addr = m_data.GetAddress(&offset);
407                        sect64.size = m_data.GetAddress(&offset);
408
409                        if (m_data.GetU32(&offset, &sect64.offset, num_u32s) == NULL)
410                            break;
411
412                        // Keep a list of mach sections around in case we need to
413                        // get at data that isn't stored in the abstracted Sections.
414                        m_mach_sections.push_back (sect64);
415
416                        ConstString section_name (sect64.sectname, std::min<size_t>(strlen(sect64.sectname), sizeof(sect64.sectname)));
417                        if (!segment_name)
418                        {
419                            // We have a segment with no name so we need to conjure up
420                            // segments that correspond to the section's segname if there
421                            // isn't already such a section. If there is such a section,
422                            // we resize the section so that it spans all sections.
423                            // We also mark these sections as fake so address matches don't
424                            // hit if they land in the gaps between the child sections.
425                            segment_name.SetTrimmedCStringWithLength(sect64.segname, sizeof(sect64.segname));
426                            segment_sp = m_sections_ap->FindSectionByName (segment_name);
427                            if (segment_sp.get())
428                            {
429                                Section *segment = segment_sp.get();
430                                // Grow the section size as needed.
431                                const lldb::addr_t sect64_min_addr = sect64.addr;
432                                const lldb::addr_t sect64_max_addr = sect64_min_addr + sect64.size;
433                                const lldb::addr_t curr_seg_byte_size = segment->GetByteSize();
434                                const lldb::addr_t curr_seg_min_addr = segment->GetFileAddress();
435                                const lldb::addr_t curr_seg_max_addr = curr_seg_min_addr + curr_seg_byte_size;
436                                if (sect64_min_addr >= curr_seg_min_addr)
437                                {
438                                    const lldb::addr_t new_seg_byte_size = sect64_max_addr - curr_seg_min_addr;
439                                    // Only grow the section size if needed
440                                    if (new_seg_byte_size > curr_seg_byte_size)
441                                        segment->SetByteSize (new_seg_byte_size);
442                                }
443                                else
444                                {
445                                    // We need to change the base address of the segment and
446                                    // adjust the child section offsets for all existing children.
447                                    const lldb::addr_t slide_amount = sect64_min_addr - curr_seg_min_addr;
448                                    segment->Slide(slide_amount, false);
449                                    segment->GetChildren().Slide (-slide_amount, false);
450                                    segment->SetByteSize (curr_seg_max_addr - sect64_min_addr);
451                                }
452
453                                // Grow the section size as needed.
454                                if (sect64.offset)
455                                {
456                                    const lldb::addr_t segment_min_file_offset = segment->GetFileOffset();
457                                    const lldb::addr_t segment_max_file_offset = segment_min_file_offset + segment->GetFileSize();
458
459                                    const lldb::addr_t section_min_file_offset = sect64.offset;
460                                    const lldb::addr_t section_max_file_offset = section_min_file_offset + sect64.size;
461                                    const lldb::addr_t new_file_offset = std::min (section_min_file_offset, segment_min_file_offset);
462                                    const lldb::addr_t new_file_size = std::max (section_max_file_offset, segment_max_file_offset) - new_file_offset;
463                                    segment->SetFileOffset (new_file_offset);
464                                    segment->SetFileSize (new_file_size);
465                                }
466                            }
467                            else
468                            {
469                                // Create a fake section for the section's named segment
470                                segment_sp.reset(new Section(segment_sp.get(),       // Parent section
471                                                             GetModule(),            // Module to which this section belongs
472                                                             ++segID << 8,           // 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
473                                                             segment_name,           // Name of this section
474                                                             eSectionTypeContainer,  // This section is a container of other sections.
475                                                             sect64.addr,            // File VM address == addresses as they are found in the object file
476                                                             sect64.size,            // VM size in bytes of this section
477                                                             sect64.offset,          // Offset to the data for this section in the file
478                                                             sect64.offset ? sect64.size : 0,        // Size in bytes of this section as found in the the file
479                                                             load_cmd.flags));       // Flags for this section
480                                segment_sp->SetIsFake(true);
481                                m_sections_ap->AddSection(segment_sp);
482                                segment_sp->SetIsEncrypted (segment_is_encrypted);
483                            }
484                        }
485                        assert (segment_sp.get());
486
487                        uint32_t mach_sect_type = sect64.flags & SectionFlagMaskSectionType;
488                        static ConstString g_sect_name_objc_data ("__objc_data");
489                        static ConstString g_sect_name_objc_msgrefs ("__objc_msgrefs");
490                        static ConstString g_sect_name_objc_selrefs ("__objc_selrefs");
491                        static ConstString g_sect_name_objc_classrefs ("__objc_classrefs");
492                        static ConstString g_sect_name_objc_superrefs ("__objc_superrefs");
493                        static ConstString g_sect_name_objc_const ("__objc_const");
494                        static ConstString g_sect_name_objc_classlist ("__objc_classlist");
495                        static ConstString g_sect_name_cfstring ("__cfstring");
496
497                        static ConstString g_sect_name_dwarf_debug_abbrev ("__debug_abbrev");
498                        static ConstString g_sect_name_dwarf_debug_aranges ("__debug_aranges");
499                        static ConstString g_sect_name_dwarf_debug_frame ("__debug_frame");
500                        static ConstString g_sect_name_dwarf_debug_info ("__debug_info");
501                        static ConstString g_sect_name_dwarf_debug_line ("__debug_line");
502                        static ConstString g_sect_name_dwarf_debug_loc ("__debug_loc");
503                        static ConstString g_sect_name_dwarf_debug_macinfo ("__debug_macinfo");
504                        static ConstString g_sect_name_dwarf_debug_pubnames ("__debug_pubnames");
505                        static ConstString g_sect_name_dwarf_debug_pubtypes ("__debug_pubtypes");
506                        static ConstString g_sect_name_dwarf_debug_ranges ("__debug_ranges");
507                        static ConstString g_sect_name_dwarf_debug_str ("__debug_str");
508                        static ConstString g_sect_name_eh_frame ("__eh_frame");
509                        static ConstString g_sect_name_DATA ("__DATA");
510                        static ConstString g_sect_name_TEXT ("__TEXT");
511
512                        SectionType sect_type = eSectionTypeOther;
513
514                        if (section_name == g_sect_name_dwarf_debug_abbrev)
515                            sect_type = eSectionTypeDWARFDebugAbbrev;
516                        else if (section_name == g_sect_name_dwarf_debug_aranges)
517                            sect_type = eSectionTypeDWARFDebugAranges;
518                        else if (section_name == g_sect_name_dwarf_debug_frame)
519                            sect_type = eSectionTypeDWARFDebugFrame;
520                        else if (section_name == g_sect_name_dwarf_debug_info)
521                            sect_type = eSectionTypeDWARFDebugInfo;
522                        else if (section_name == g_sect_name_dwarf_debug_line)
523                            sect_type = eSectionTypeDWARFDebugLine;
524                        else if (section_name == g_sect_name_dwarf_debug_loc)
525                            sect_type = eSectionTypeDWARFDebugLoc;
526                        else if (section_name == g_sect_name_dwarf_debug_macinfo)
527                            sect_type = eSectionTypeDWARFDebugMacInfo;
528                        else if (section_name == g_sect_name_dwarf_debug_pubnames)
529                            sect_type = eSectionTypeDWARFDebugPubNames;
530                        else if (section_name == g_sect_name_dwarf_debug_pubtypes)
531                            sect_type = eSectionTypeDWARFDebugPubTypes;
532                        else if (section_name == g_sect_name_dwarf_debug_ranges)
533                            sect_type = eSectionTypeDWARFDebugRanges;
534                        else if (section_name == g_sect_name_dwarf_debug_str)
535                            sect_type = eSectionTypeDWARFDebugStr;
536                        else if (section_name == g_sect_name_objc_selrefs)
537                            sect_type = eSectionTypeDataCStringPointers;
538                        else if (section_name == g_sect_name_objc_msgrefs)
539                            sect_type = eSectionTypeDataObjCMessageRefs;
540                        else if (section_name == g_sect_name_eh_frame)
541                            sect_type = eSectionTypeEHFrame;
542                        else if (section_name == g_sect_name_cfstring)
543                            sect_type = eSectionTypeDataObjCCFStrings;
544                        else if (section_name == g_sect_name_objc_data ||
545                                 section_name == g_sect_name_objc_classrefs ||
546                                 section_name == g_sect_name_objc_superrefs ||
547                                 section_name == g_sect_name_objc_const ||
548                                 section_name == g_sect_name_objc_classlist)
549                        {
550                            sect_type = eSectionTypeDataPointers;
551                        }
552
553                        if (sect_type == eSectionTypeOther)
554                        {
555                            switch (mach_sect_type)
556                            {
557                            // TODO: categorize sections by other flags for regular sections
558                            case SectionTypeRegular:
559                                if (segment_sp->GetName() == g_sect_name_TEXT)
560                                    sect_type = eSectionTypeCode;
561                                else if (segment_sp->GetName() == g_sect_name_DATA)
562                                    sect_type = eSectionTypeData;
563                                else
564                                    sect_type = eSectionTypeOther;
565                                break;
566                            case SectionTypeZeroFill:                   sect_type = eSectionTypeZeroFill; break;
567                            case SectionTypeCStringLiterals:            sect_type = eSectionTypeDataCString;    break; // section with only literal C strings
568                            case SectionType4ByteLiterals:              sect_type = eSectionTypeData4;    break; // section with only 4 byte literals
569                            case SectionType8ByteLiterals:              sect_type = eSectionTypeData8;    break; // section with only 8 byte literals
570                            case SectionTypeLiteralPointers:            sect_type = eSectionTypeDataPointers;  break; // section with only pointers to literals
571                            case SectionTypeNonLazySymbolPointers:      sect_type = eSectionTypeDataPointers;  break; // section with only non-lazy symbol pointers
572                            case SectionTypeLazySymbolPointers:         sect_type = eSectionTypeDataPointers;  break; // section with only lazy symbol pointers
573                            case SectionTypeSymbolStubs:                sect_type = eSectionTypeCode;  break; // section with only symbol stubs, byte size of stub in the reserved2 field
574                            case SectionTypeModuleInitFunctionPointers: sect_type = eSectionTypeDataPointers;    break; // section with only function pointers for initialization
575                            case SectionTypeModuleTermFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for termination
576                            case SectionTypeCoalesced:                  sect_type = eSectionTypeOther; break;
577                            case SectionTypeZeroFillLarge:              sect_type = eSectionTypeZeroFill; break;
578                            case SectionTypeInterposing:                sect_type = eSectionTypeCode;  break; // section with only pairs of function pointers for interposing
579                            case SectionType16ByteLiterals:             sect_type = eSectionTypeData16; break; // section with only 16 byte literals
580                            case SectionTypeDTraceObjectFormat:         sect_type = eSectionTypeDebug; break;
581                            case SectionTypeLazyDylibSymbolPointers:    sect_type = eSectionTypeDataPointers;  break;
582                            default: break;
583                            }
584                        }
585
586                        SectionSP section_sp(new Section(segment_sp.get(),
587                                                         GetModule(),
588                                                         ++sectID,
589                                                         section_name,
590                                                         sect_type,
591                                                         sect64.addr - segment_sp->GetFileAddress(),
592                                                         sect64.size,
593                                                         sect64.offset,
594                                                         sect64.offset == 0 ? 0 : sect64.size,
595                                                         sect64.flags));
596                        // Set the section to be encrypted to match the segment
597                        section_sp->SetIsEncrypted (segment_is_encrypted);
598
599                        segment_sp->GetChildren().AddSection(section_sp);
600
601                        if (segment_sp->IsFake())
602                        {
603                            segment_sp.reset();
604                            segment_name.Clear();
605                        }
606                    }
607                    if (segment_sp && m_header.filetype == HeaderFileTypeDSYM)
608                    {
609                        if (first_segment_sectID <= sectID)
610                        {
611                            lldb::user_id_t sect_uid;
612                            for (sect_uid = first_segment_sectID; sect_uid <= sectID; ++sect_uid)
613                            {
614                                SectionSP curr_section_sp(segment_sp->GetChildren().FindSectionByID (sect_uid));
615                                SectionSP next_section_sp;
616                                if (sect_uid + 1 <= sectID)
617                                    next_section_sp = segment_sp->GetChildren().FindSectionByID (sect_uid+1);
618
619                                if (curr_section_sp.get())
620                                {
621                                    if (curr_section_sp->GetByteSize() == 0)
622                                    {
623                                        if (next_section_sp.get() != NULL)
624                                            curr_section_sp->SetByteSize ( next_section_sp->GetFileAddress() - curr_section_sp->GetFileAddress() );
625                                        else
626                                            curr_section_sp->SetByteSize ( load_cmd.vmsize );
627                                    }
628                                }
629                            }
630                        }
631                    }
632                }
633            }
634        }
635        else if (load_cmd.cmd == LoadCommandDynamicSymtabInfo)
636        {
637            m_dysymtab.cmd = load_cmd.cmd;
638            m_dysymtab.cmdsize = load_cmd.cmdsize;
639            m_data.GetU32 (&offset, &m_dysymtab.ilocalsym, (sizeof(m_dysymtab) / sizeof(uint32_t)) - 2);
640        }
641
642        offset = load_cmd_offset + load_cmd.cmdsize;
643    }
644//    if (dump_sections)
645//    {
646//        StreamFile s(stdout);
647//        m_sections_ap->Dump(&s, true);
648//    }
649    return sectID;  // Return the number of sections we registered with the module
650}
651
652class MachSymtabSectionInfo
653{
654public:
655
656    MachSymtabSectionInfo (SectionList *section_list) :
657        m_section_list (section_list),
658        m_section_infos()
659    {
660        // Get the number of sections down to a depth of 1 to include
661        // all segments and their sections, but no other sections that
662        // may be added for debug map or
663        m_section_infos.resize(section_list->GetNumSections(1));
664    }
665
666
667    Section *
668    GetSection (uint8_t n_sect, addr_t file_addr)
669    {
670        if (n_sect == 0)
671            return NULL;
672        if (n_sect < m_section_infos.size())
673        {
674            if (m_section_infos[n_sect].section == NULL)
675            {
676                Section *section = m_section_list->FindSectionByID (n_sect).get();
677                m_section_infos[n_sect].section = section;
678                if (section != NULL)
679                {
680                    m_section_infos[n_sect].vm_range.SetBaseAddress (section->GetFileAddress());
681                    m_section_infos[n_sect].vm_range.SetByteSize (section->GetByteSize());
682                }
683                else
684                {
685                    fprintf (stderr, "error: unable to find section for section %u\n", n_sect);
686                }
687            }
688            if (m_section_infos[n_sect].vm_range.Contains(file_addr))
689            {
690                // Symbol is in section.
691                return m_section_infos[n_sect].section;
692            }
693            else if (m_section_infos[n_sect].vm_range.GetByteSize () == 0 &&
694                     m_section_infos[n_sect].vm_range.GetBaseAddress() == file_addr)
695            {
696                // Symbol is in section with zero size, but has the same start
697                // address as the section. This can happen with linker symbols
698                // (symbols that start with the letter 'l' or 'L'.
699                return m_section_infos[n_sect].section;
700            }
701        }
702        return m_section_list->FindSectionContainingFileAddress(file_addr).get();
703    }
704
705protected:
706    struct SectionInfo
707    {
708        SectionInfo () :
709            vm_range(),
710            section (NULL)
711        {
712        }
713
714        VMRange vm_range;
715        Section *section;
716    };
717    SectionList *m_section_list;
718    std::vector<SectionInfo> m_section_infos;
719};
720
721
722
723size_t
724ObjectFileMachO::ParseSymtab (bool minimize)
725{
726    Timer scoped_timer(__PRETTY_FUNCTION__,
727                       "ObjectFileMachO::ParseSymtab () module = %s",
728                       m_file.GetFilename().AsCString(""));
729    struct symtab_command symtab_load_command;
730    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
731    uint32_t i;
732    for (i=0; i<m_header.ncmds; ++i)
733    {
734        const uint32_t cmd_offset = offset;
735        // Read in the load command and load command size
736        if (m_data.GetU32(&offset, &symtab_load_command, 2) == NULL)
737            break;
738        // Watch for the symbol table load command
739        if (symtab_load_command.cmd == LoadCommandSymtab)
740        {
741            // Read in the rest of the symtab load command
742            if (m_data.GetU32(&offset, &symtab_load_command.symoff, 4)) // fill in symoff, nsyms, stroff, strsize fields
743            {
744                Symtab *symtab = m_symtab_ap.get();
745                SectionList *section_list = GetSectionList();
746                assert(section_list);
747                const size_t addr_size = m_data.GetAddressByteSize();
748                const ByteOrder endian = m_data.GetByteOrder();
749                bool bit_width_32 = addr_size == 4;
750                const size_t nlist_size = bit_width_32 ? sizeof(struct nlist) : sizeof(struct nlist_64);
751
752                DataBufferSP symtab_data_sp(m_file.ReadFileContents(m_offset + symtab_load_command.symoff, symtab_load_command.nsyms * nlist_size));
753                DataBufferSP strtab_data_sp(m_file.ReadFileContents(m_offset + symtab_load_command.stroff, symtab_load_command.strsize));
754
755                const char *strtab_data = (const char *)strtab_data_sp->GetBytes();
756//                DataExtractor symtab_data(symtab_data_sp, endian, addr_size);
757//                DataExtractor strtab_data(strtab_data_sp, endian, addr_size);
758
759                static ConstString g_segment_name_TEXT ("__TEXT");
760                static ConstString g_segment_name_DATA ("__DATA");
761                static ConstString g_segment_name_OBJC ("__OBJC");
762                static ConstString g_section_name_eh_frame ("__eh_frame");
763                SectionSP text_section_sp(section_list->FindSectionByName(g_segment_name_TEXT));
764                SectionSP data_section_sp(section_list->FindSectionByName(g_segment_name_DATA));
765                SectionSP objc_section_sp(section_list->FindSectionByName(g_segment_name_OBJC));
766                SectionSP eh_frame_section_sp;
767                if (text_section_sp.get())
768                    eh_frame_section_sp = text_section_sp->GetChildren().FindSectionByName (g_section_name_eh_frame);
769                else
770                    eh_frame_section_sp = section_list->FindSectionByName (g_section_name_eh_frame);
771
772                uint8_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NListSectionNoSection;
773                //uint32_t symtab_offset = 0;
774                const uint8_t* nlist_data = symtab_data_sp->GetBytes();
775                assert (symtab_data_sp->GetByteSize()/nlist_size >= symtab_load_command.nsyms);
776
777
778                if (endian != lldb::endian::InlHostByteOrder())
779                {
780                    // ...
781                    assert (!"UNIMPLEMENTED: Swap all nlist entries");
782                }
783                uint32_t N_SO_index = UINT32_MAX;
784
785                MachSymtabSectionInfo section_info (section_list);
786                std::vector<uint32_t> N_FUN_indexes;
787                std::vector<uint32_t> N_NSYM_indexes;
788                std::vector<uint32_t> N_INCL_indexes;
789                std::vector<uint32_t> N_BRAC_indexes;
790                std::vector<uint32_t> N_COMM_indexes;
791                typedef std::map <uint64_t, uint32_t> ValueToSymbolIndexMap;
792                typedef std::map <uint32_t, uint32_t> NListIndexToSymbolIndexMap;
793                ValueToSymbolIndexMap N_FUN_addr_to_sym_idx;
794                ValueToSymbolIndexMap N_STSYM_addr_to_sym_idx;
795                // Any symbols that get merged into another will get an entry
796                // in this map so we know
797                NListIndexToSymbolIndexMap m_nlist_idx_to_sym_idx;
798                uint32_t nlist_idx = 0;
799                Symbol *symbol_ptr = NULL;
800
801                uint32_t sym_idx = 0;
802                Symbol *sym = symtab->Resize (symtab_load_command.nsyms + m_dysymtab.nindirectsyms);
803                uint32_t num_syms = symtab->GetNumSymbols();
804
805                //symtab->Reserve (symtab_load_command.nsyms + m_dysymtab.nindirectsyms);
806                for (nlist_idx = 0; nlist_idx < symtab_load_command.nsyms; ++nlist_idx)
807                {
808                    struct nlist_64 nlist;
809                    if (bit_width_32)
810                    {
811                        struct nlist* nlist32_ptr = (struct nlist*)(nlist_data + (nlist_idx * nlist_size));
812                        nlist.n_strx = nlist32_ptr->n_strx;
813                        nlist.n_type = nlist32_ptr->n_type;
814                        nlist.n_sect = nlist32_ptr->n_sect;
815                        nlist.n_desc = nlist32_ptr->n_desc;
816                        nlist.n_value = nlist32_ptr->n_value;
817                    }
818                    else
819                    {
820                        nlist = *((struct nlist_64*)(nlist_data + (nlist_idx * nlist_size)));
821                    }
822
823                    SymbolType type = eSymbolTypeInvalid;
824                    const char* symbol_name = &strtab_data[nlist.n_strx];
825                    if (symbol_name[0] == '\0')
826                        symbol_name = NULL;
827                    Section* symbol_section = NULL;
828                    bool add_nlist = true;
829                    bool is_debug = ((nlist.n_type & NlistMaskStab) != 0);
830
831                    assert (sym_idx < num_syms);
832
833                    sym[sym_idx].SetDebug (is_debug);
834
835                    if (is_debug)
836                    {
837                        switch (nlist.n_type)
838                        {
839                        case StabGlobalSymbol:
840                            // N_GSYM -- global symbol: name,,NO_SECT,type,0
841                            // Sometimes the N_GSYM value contains the address.
842                            sym[sym_idx].SetExternal(true);
843                            if (nlist.n_value != 0)
844                                symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
845                            type = eSymbolTypeData;
846                            break;
847
848                        case StabFunctionName:
849                            // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0
850                            type = eSymbolTypeCompiler;
851                            break;
852
853                        case StabFunction:
854                            // N_FUN -- procedure: name,,n_sect,linenumber,address
855                            if (symbol_name)
856                            {
857                                type = eSymbolTypeCode;
858                                symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
859
860                                N_FUN_addr_to_sym_idx[nlist.n_value] = sym_idx;
861                                // We use the current number of symbols in the symbol table in lieu of
862                                // using nlist_idx in case we ever start trimming entries out
863                                N_FUN_indexes.push_back(sym_idx);
864                            }
865                            else
866                            {
867                                type = eSymbolTypeCompiler;
868
869                                if ( !N_FUN_indexes.empty() )
870                                {
871                                    // Copy the size of the function into the original STAB entry so we don't have
872                                    // to hunt for it later
873                                    symtab->SymbolAtIndex(N_FUN_indexes.back())->SetByteSize(nlist.n_value);
874                                    N_FUN_indexes.pop_back();
875                                    // We don't really need the end function STAB as it contains the size which
876                                    // we already placed with the original symbol, so don't add it if we want a
877                                    // minimal symbol table
878                                    if (minimize)
879                                        add_nlist = false;
880                                }
881                            }
882                            break;
883
884                        case StabStaticSymbol:
885                            // N_STSYM -- static symbol: name,,n_sect,type,address
886                            N_STSYM_addr_to_sym_idx[nlist.n_value] = sym_idx;
887                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
888                            type = eSymbolTypeData;
889                            break;
890
891                        case StabLocalCommon:
892                            // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address
893                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
894                            type = eSymbolTypeCommonBlock;
895                            break;
896
897                        case StabBeginSymbol:
898                            // N_BNSYM
899                            // We use the current number of symbols in the symbol table in lieu of
900                            // using nlist_idx in case we ever start trimming entries out
901                            if (minimize)
902                            {
903                                // Skip these if we want minimal symbol tables
904                                add_nlist = false;
905                            }
906                            else
907                            {
908                                symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
909                                N_NSYM_indexes.push_back(sym_idx);
910                                type = eSymbolTypeScopeBegin;
911                            }
912                            break;
913
914                        case StabEndSymbol:
915                            // N_ENSYM
916                            // Set the size of the N_BNSYM to the terminating index of this N_ENSYM
917                            // so that we can always skip the entire symbol if we need to navigate
918                            // more quickly at the source level when parsing STABS
919                            if (minimize)
920                            {
921                                // Skip these if we want minimal symbol tables
922                                add_nlist = false;
923                            }
924                            else
925                            {
926                                if ( !N_NSYM_indexes.empty() )
927                                {
928                                    symbol_ptr = symtab->SymbolAtIndex(N_NSYM_indexes.back());
929                                    symbol_ptr->SetByteSize(sym_idx + 1);
930                                    symbol_ptr->SetSizeIsSibling(true);
931                                    N_NSYM_indexes.pop_back();
932                                }
933                                type = eSymbolTypeScopeEnd;
934                            }
935                            break;
936
937
938                        case StabSourceFileOptions:
939                            // N_OPT - emitted with gcc2_compiled and in gcc source
940                            type = eSymbolTypeCompiler;
941                            break;
942
943                        case StabRegisterSymbol:
944                            // N_RSYM - register sym: name,,NO_SECT,type,register
945                            type = eSymbolTypeVariable;
946                            break;
947
948                        case StabSourceLine:
949                            // N_SLINE - src line: 0,,n_sect,linenumber,address
950                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
951                            type = eSymbolTypeLineEntry;
952                            break;
953
954                        case StabStructureType:
955                            // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset
956                            type = eSymbolTypeVariableType;
957                            break;
958
959                        case StabSourceFileName:
960                            // N_SO - source file name
961                            type = eSymbolTypeSourceFile;
962                            if (symbol_name == NULL)
963                            {
964                                if (minimize)
965                                    add_nlist = false;
966                                if (N_SO_index != UINT32_MAX)
967                                {
968                                    // Set the size of the N_SO to the terminating index of this N_SO
969                                    // so that we can always skip the entire N_SO if we need to navigate
970                                    // more quickly at the source level when parsing STABS
971                                    symbol_ptr = symtab->SymbolAtIndex(N_SO_index);
972                                    symbol_ptr->SetByteSize(sym_idx + (minimize ? 0 : 1));
973                                    symbol_ptr->SetSizeIsSibling(true);
974                                }
975                                N_NSYM_indexes.clear();
976                                N_INCL_indexes.clear();
977                                N_BRAC_indexes.clear();
978                                N_COMM_indexes.clear();
979                                N_FUN_indexes.clear();
980                                N_SO_index = UINT32_MAX;
981                            }
982                            else
983                            {
984                                // We use the current number of symbols in the symbol table in lieu of
985                                // using nlist_idx in case we ever start trimming entries out
986                                if (symbol_name[0] == '/')
987                                    N_SO_index = sym_idx;
988                                else if (minimize && (N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
989                                {
990                                    const char *so_path = sym[sym_idx - 1].GetMangled().GetDemangledName().AsCString();
991                                    if (so_path && so_path[0])
992                                    {
993                                        std::string full_so_path (so_path);
994                                        if (*full_so_path.rbegin() != '/')
995                                            full_so_path += '/';
996                                        full_so_path += symbol_name;
997                                        sym[sym_idx - 1].GetMangled().SetValue(full_so_path.c_str(), false);
998                                        add_nlist = false;
999                                        m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
1000                                    }
1001                                }
1002                            }
1003
1004                            break;
1005
1006                        case StabObjectFileName:
1007                            // N_OSO - object file name: name,,0,0,st_mtime
1008                            type = eSymbolTypeObjectFile;
1009                            break;
1010
1011                        case StabLocalSymbol:
1012                            // N_LSYM - local sym: name,,NO_SECT,type,offset
1013                            type = eSymbolTypeLocal;
1014                            break;
1015
1016                        //----------------------------------------------------------------------
1017                        // INCL scopes
1018                        //----------------------------------------------------------------------
1019                        case StabBeginIncludeFileName:
1020                            // N_BINCL - include file beginning: name,,NO_SECT,0,sum
1021                            // We use the current number of symbols in the symbol table in lieu of
1022                            // using nlist_idx in case we ever start trimming entries out
1023                            N_INCL_indexes.push_back(sym_idx);
1024                            type = eSymbolTypeScopeBegin;
1025                            break;
1026
1027                        case StabEndIncludeFile:
1028                            // N_EINCL - include file end: name,,NO_SECT,0,0
1029                            // Set the size of the N_BINCL to the terminating index of this N_EINCL
1030                            // so that we can always skip the entire symbol if we need to navigate
1031                            // more quickly at the source level when parsing STABS
1032                            if ( !N_INCL_indexes.empty() )
1033                            {
1034                                symbol_ptr = symtab->SymbolAtIndex(N_INCL_indexes.back());
1035                                symbol_ptr->SetByteSize(sym_idx + 1);
1036                                symbol_ptr->SetSizeIsSibling(true);
1037                                N_INCL_indexes.pop_back();
1038                            }
1039                            type = eSymbolTypeScopeEnd;
1040                            break;
1041
1042                        case StabIncludeFileName:
1043                            // N_SOL - #included file name: name,,n_sect,0,address
1044                            type = eSymbolTypeHeaderFile;
1045
1046                            // We currently don't use the header files on darwin
1047                            if (minimize)
1048                                add_nlist = false;
1049                            break;
1050
1051                        case StabCompilerParameters:
1052                            // N_PARAMS - compiler parameters: name,,NO_SECT,0,0
1053                            type = eSymbolTypeCompiler;
1054                            break;
1055
1056                        case StabCompilerVersion:
1057                            // N_VERSION - compiler version: name,,NO_SECT,0,0
1058                            type = eSymbolTypeCompiler;
1059                            break;
1060
1061                        case StabCompilerOptLevel:
1062                            // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0
1063                            type = eSymbolTypeCompiler;
1064                            break;
1065
1066                        case StabParameter:
1067                            // N_PSYM - parameter: name,,NO_SECT,type,offset
1068                            type = eSymbolTypeVariable;
1069                            break;
1070
1071                        case StabAlternateEntry:
1072                            // N_ENTRY - alternate entry: name,,n_sect,linenumber,address
1073                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1074                            type = eSymbolTypeLineEntry;
1075                            break;
1076
1077                        //----------------------------------------------------------------------
1078                        // Left and Right Braces
1079                        //----------------------------------------------------------------------
1080                        case StabLeftBracket:
1081                            // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address
1082                            // We use the current number of symbols in the symbol table in lieu of
1083                            // using nlist_idx in case we ever start trimming entries out
1084                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1085                            N_BRAC_indexes.push_back(sym_idx);
1086                            type = eSymbolTypeScopeBegin;
1087                            break;
1088
1089                        case StabRightBracket:
1090                            // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address
1091                            // Set the size of the N_LBRAC to the terminating index of this N_RBRAC
1092                            // so that we can always skip the entire symbol if we need to navigate
1093                            // more quickly at the source level when parsing STABS
1094                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1095                            if ( !N_BRAC_indexes.empty() )
1096                            {
1097                                symbol_ptr = symtab->SymbolAtIndex(N_BRAC_indexes.back());
1098                                symbol_ptr->SetByteSize(sym_idx + 1);
1099                                symbol_ptr->SetSizeIsSibling(true);
1100                                N_BRAC_indexes.pop_back();
1101                            }
1102                            type = eSymbolTypeScopeEnd;
1103                            break;
1104
1105                        case StabDeletedIncludeFile:
1106                            // N_EXCL - deleted include file: name,,NO_SECT,0,sum
1107                            type = eSymbolTypeHeaderFile;
1108                            break;
1109
1110                        //----------------------------------------------------------------------
1111                        // COMM scopes
1112                        //----------------------------------------------------------------------
1113                        case StabBeginCommon:
1114                            // N_BCOMM - begin common: name,,NO_SECT,0,0
1115                            // We use the current number of symbols in the symbol table in lieu of
1116                            // using nlist_idx in case we ever start trimming entries out
1117                            type = eSymbolTypeScopeBegin;
1118                            N_COMM_indexes.push_back(sym_idx);
1119                            break;
1120
1121                        case StabEndCommonLocal:
1122                            // N_ECOML - end common (local name): 0,,n_sect,0,address
1123                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1124                            // Fall through
1125
1126                        case StabEndCommon:
1127                            // N_ECOMM - end common: name,,n_sect,0,0
1128                            // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML
1129                            // so that we can always skip the entire symbol if we need to navigate
1130                            // more quickly at the source level when parsing STABS
1131                            if ( !N_COMM_indexes.empty() )
1132                            {
1133                                symbol_ptr = symtab->SymbolAtIndex(N_COMM_indexes.back());
1134                                symbol_ptr->SetByteSize(sym_idx + 1);
1135                                symbol_ptr->SetSizeIsSibling(true);
1136                                N_COMM_indexes.pop_back();
1137                            }
1138                            type = eSymbolTypeScopeEnd;
1139                            break;
1140
1141                        case StabLength:
1142                            // N_LENG - second stab entry with length information
1143                            type = eSymbolTypeAdditional;
1144                            break;
1145
1146                        default: break;
1147                        }
1148                    }
1149                    else
1150                    {
1151                        //uint8_t n_pext    = NlistMaskPrivateExternal & nlist.n_type;
1152                        uint8_t n_type  = NlistMaskType & nlist.n_type;
1153                        sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0);
1154
1155                        if (symbol_name && ::strstr (symbol_name, ".objc") == symbol_name)
1156                        {
1157                            type = eSymbolTypeRuntime;
1158                        }
1159                        else
1160                        {
1161                            switch (n_type)
1162                            {
1163                            case NListTypeIndirect:         // N_INDR - Fall through
1164                            case NListTypePreboundUndefined:// N_PBUD - Fall through
1165                            case NListTypeUndefined:        // N_UNDF
1166                                type = eSymbolTypeExtern;
1167                                break;
1168
1169                            case NListTypeAbsolute:         // N_ABS
1170                                type = eSymbolTypeAbsolute;
1171                                break;
1172
1173                            case NListTypeSection:          // N_SECT
1174                                symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1175
1176                                if (symbol_section == NULL)
1177                                {
1178                                    // TODO: warn about this?
1179                                    add_nlist = false;
1180                                    break;
1181                                }
1182
1183                                if (TEXT_eh_frame_sectID == nlist.n_sect)
1184                                {
1185                                    type = eSymbolTypeException;
1186                                }
1187                                else
1188                                {
1189                                    uint32_t section_type = symbol_section->Get() & SectionFlagMaskSectionType;
1190
1191                                    switch (section_type)
1192                                    {
1193                                    case SectionTypeRegular:                     break; // regular section
1194                                    //case SectionTypeZeroFill:                 type = eSymbolTypeData;    break; // zero fill on demand section
1195                                    case SectionTypeCStringLiterals:            type = eSymbolTypeData;    break; // section with only literal C strings
1196                                    case SectionType4ByteLiterals:              type = eSymbolTypeData;    break; // section with only 4 byte literals
1197                                    case SectionType8ByteLiterals:              type = eSymbolTypeData;    break; // section with only 8 byte literals
1198                                    case SectionTypeLiteralPointers:            type = eSymbolTypeTrampoline; break; // section with only pointers to literals
1199                                    case SectionTypeNonLazySymbolPointers:      type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers
1200                                    case SectionTypeLazySymbolPointers:         type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers
1201                                    case SectionTypeSymbolStubs:                type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field
1202                                    case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for initialization
1203                                    case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for termination
1204                                    //case SectionTypeCoalesced:                type = eSymbolType;    break; // section contains symbols that are to be coalesced
1205                                    //case SectionTypeZeroFillLarge:            type = eSymbolTypeData;    break; // zero fill on demand section (that can be larger than 4 gigabytes)
1206                                    case SectionTypeInterposing:                type = eSymbolTypeTrampoline;  break; // section with only pairs of function pointers for interposing
1207                                    case SectionType16ByteLiterals:             type = eSymbolTypeData;    break; // section with only 16 byte literals
1208                                    case SectionTypeDTraceObjectFormat:         type = eSymbolTypeInstrumentation; break;
1209                                    case SectionTypeLazyDylibSymbolPointers:    type = eSymbolTypeTrampoline; break;
1210                                    default: break;
1211                                    }
1212
1213                                    if (type == eSymbolTypeInvalid)
1214                                    {
1215                                        const char *symbol_sect_name = symbol_section->GetName().AsCString();
1216                                        if (symbol_section->IsDescendant (text_section_sp.get()))
1217                                        {
1218                                            if (symbol_section->IsClear(SectionAttrUserPureInstructions |
1219                                                                        SectionAttrUserSelfModifyingCode |
1220                                                                        SectionAttrSytemSomeInstructions))
1221                                                type = eSymbolTypeData;
1222                                            else
1223                                                type = eSymbolTypeCode;
1224                                        }
1225                                        else
1226                                        if (symbol_section->IsDescendant(data_section_sp.get()))
1227                                        {
1228                                            if (symbol_sect_name && ::strstr (symbol_sect_name, "__objc") == symbol_sect_name)
1229                                            {
1230                                                type = eSymbolTypeRuntime;
1231                                            }
1232                                            else
1233                                            if (symbol_sect_name && ::strstr (symbol_sect_name, "__gcc_except_tab") == symbol_sect_name)
1234                                            {
1235                                                type = eSymbolTypeException;
1236                                            }
1237                                            else
1238                                            {
1239                                                type = eSymbolTypeData;
1240                                            }
1241                                        }
1242                                        else
1243                                        if (symbol_sect_name && ::strstr (symbol_sect_name, "__IMPORT") == symbol_sect_name)
1244                                        {
1245                                            type = eSymbolTypeTrampoline;
1246                                        }
1247                                        else
1248                                        if (symbol_section->IsDescendant(objc_section_sp.get()))
1249                                        {
1250                                            type = eSymbolTypeRuntime;
1251                                        }
1252                                    }
1253                                }
1254                                break;
1255                            }
1256                        }
1257                    }
1258                    if (add_nlist)
1259                    {
1260                        bool symbol_name_is_mangled = false;
1261                        if (symbol_name && symbol_name[0] == '_')
1262                        {
1263                            symbol_name_is_mangled = symbol_name[1] == '_';
1264                            symbol_name++;  // Skip the leading underscore
1265                        }
1266                        uint64_t symbol_value = nlist.n_value;
1267
1268                        if (symbol_name)
1269                            sym[sym_idx].GetMangled().SetValue(symbol_name, symbol_name_is_mangled);
1270                        if (is_debug == false)
1271                        {
1272                            if (type == eSymbolTypeCode)
1273                            {
1274                                // See if we can find a N_FUN entry for any code symbols.
1275                                // If we do find a match, and the name matches, then we
1276                                // can merge the two into just the function symbol to avoid
1277                                // duplicate entries in the symbol table
1278                                ValueToSymbolIndexMap::const_iterator pos = N_FUN_addr_to_sym_idx.find (nlist.n_value);
1279                                if (pos != N_FUN_addr_to_sym_idx.end())
1280                                {
1281                                    if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) ||
1282                                        (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName()))
1283                                    {
1284                                        m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
1285                                        // We just need the flags from the linker symbol, so put these flags
1286                                        // into the N_FUN flags to avoid duplicate symbols in the symbol table
1287                                        sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
1288                                        sym[sym_idx].Clear();
1289                                        continue;
1290                                    }
1291                                }
1292                            }
1293                            else if (type == eSymbolTypeData)
1294                            {
1295                                // See if we can find a N_STSYM entry for any data symbols.
1296                                // If we do find a match, and the name matches, then we
1297                                // can merge the two into just the Static symbol to avoid
1298                                // duplicate entries in the symbol table
1299                                ValueToSymbolIndexMap::const_iterator pos = N_STSYM_addr_to_sym_idx.find (nlist.n_value);
1300                                if (pos != N_STSYM_addr_to_sym_idx.end())
1301                                {
1302                                    if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) ||
1303                                        (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName()))
1304                                    {
1305                                        m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
1306                                        // We just need the flags from the linker symbol, so put these flags
1307                                        // into the N_STSYM flags to avoid duplicate symbols in the symbol table
1308                                        sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
1309                                        sym[sym_idx].Clear();
1310                                        continue;
1311                                    }
1312                                }
1313                            }
1314                        }
1315                        if (symbol_section != NULL)
1316                            symbol_value -= symbol_section->GetFileAddress();
1317
1318                        sym[sym_idx].SetID (nlist_idx);
1319                        sym[sym_idx].SetType (type);
1320                        sym[sym_idx].GetAddressRangeRef().GetBaseAddress().SetSection (symbol_section);
1321                        sym[sym_idx].GetAddressRangeRef().GetBaseAddress().SetOffset (symbol_value);
1322                        sym[sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
1323
1324                        ++sym_idx;
1325                    }
1326                    else
1327                    {
1328                        sym[sym_idx].Clear();
1329                    }
1330
1331                }
1332
1333                // STAB N_GSYM entries end up having a symbol type eSymbolTypeGlobal and when the symbol value
1334                // is zero, the address of the global ends up being in a non-STAB entry. Try and fix up all
1335                // such entries by figuring out what the address for the global is by looking up this non-STAB
1336                // entry and copying the value into the debug symbol's value to save us the hassle in the
1337                // debug symbol parser.
1338
1339                Symbol *global_symbol = NULL;
1340                for (nlist_idx = 0;
1341                     nlist_idx < symtab_load_command.nsyms && (global_symbol = symtab->FindSymbolWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, nlist_idx)) != NULL;
1342                     nlist_idx++)
1343                {
1344                    if (global_symbol->GetValue().GetFileAddress() == 0)
1345                    {
1346                        std::vector<uint32_t> indexes;
1347                        if (symtab->AppendSymbolIndexesWithName (global_symbol->GetMangled().GetName(), indexes) > 0)
1348                        {
1349                            std::vector<uint32_t>::const_iterator pos;
1350                            std::vector<uint32_t>::const_iterator end = indexes.end();
1351                            for (pos = indexes.begin(); pos != end; ++pos)
1352                            {
1353                                symbol_ptr = symtab->SymbolAtIndex(*pos);
1354                                if (symbol_ptr != global_symbol && symbol_ptr->IsDebug() == false)
1355                                {
1356                                    global_symbol->SetValue(symbol_ptr->GetValue());
1357                                    break;
1358                                }
1359                            }
1360                        }
1361                    }
1362                }
1363
1364                // Trim our symbols down to just what we ended up with after
1365                // removing any symbols.
1366                if (sym_idx < num_syms)
1367                {
1368                    num_syms = sym_idx;
1369                    sym = symtab->Resize (num_syms);
1370                }
1371
1372                // Now synthesize indirect symbols
1373                if (m_dysymtab.nindirectsyms != 0)
1374                {
1375                    DataBufferSP indirect_symbol_indexes_sp(m_file.ReadFileContents(m_offset + m_dysymtab.indirectsymoff, m_dysymtab.nindirectsyms * 4));
1376
1377                    if (indirect_symbol_indexes_sp && indirect_symbol_indexes_sp->GetByteSize())
1378                    {
1379                        NListIndexToSymbolIndexMap::const_iterator end_index_pos = m_nlist_idx_to_sym_idx.end();
1380                        DataExtractor indirect_symbol_index_data (indirect_symbol_indexes_sp, m_data.GetByteOrder(), m_data.GetAddressByteSize());
1381
1382                        for (uint32_t sect_idx = 1; sect_idx < m_mach_sections.size(); ++sect_idx)
1383                        {
1384                            if ((m_mach_sections[sect_idx].flags & SectionFlagMaskSectionType) == SectionTypeSymbolStubs)
1385                            {
1386                                uint32_t symbol_stub_byte_size = m_mach_sections[sect_idx].reserved2;
1387                                if (symbol_stub_byte_size == 0)
1388                                    continue;
1389
1390                                const uint32_t num_symbol_stubs = m_mach_sections[sect_idx].size / symbol_stub_byte_size;
1391
1392                                if (num_symbol_stubs == 0)
1393                                    continue;
1394
1395                                const uint32_t symbol_stub_index_offset = m_mach_sections[sect_idx].reserved1;
1396                                uint32_t synthetic_stub_sym_id = symtab_load_command.nsyms;
1397                                for (uint32_t stub_idx = 0; stub_idx < num_symbol_stubs; ++stub_idx)
1398                                {
1399                                    const uint32_t symbol_stub_index = symbol_stub_index_offset + stub_idx;
1400                                    const lldb::addr_t symbol_stub_addr = m_mach_sections[sect_idx].addr + (stub_idx * symbol_stub_byte_size);
1401                                    uint32_t symbol_stub_offset = symbol_stub_index * 4;
1402                                    if (indirect_symbol_index_data.ValidOffsetForDataOfSize(symbol_stub_offset, 4))
1403                                    {
1404                                        const uint32_t stub_sym_id = indirect_symbol_index_data.GetU32 (&symbol_stub_offset);
1405                                        if (stub_sym_id & (IndirectSymbolAbsolute | IndirectSymbolLocal))
1406                                            continue;
1407
1408                                        NListIndexToSymbolIndexMap::const_iterator index_pos = m_nlist_idx_to_sym_idx.find (stub_sym_id);
1409                                        Symbol *stub_symbol = NULL;
1410                                        if (index_pos != end_index_pos)
1411                                        {
1412                                            // We have a remapping from the original nlist index to
1413                                            // a current symbol index, so just look this up by index
1414                                            stub_symbol = symtab->SymbolAtIndex (index_pos->second);
1415                                        }
1416                                        else
1417                                        {
1418                                            // We need to lookup a symbol using the original nlist
1419                                            // symbol index since this index is coming from the
1420                                            // S_SYMBOL_STUBS
1421                                            stub_symbol = symtab->FindSymbolByID (stub_sym_id);
1422                                        }
1423
1424                                        assert (stub_symbol);
1425                                        if (stub_symbol)
1426                                        {
1427                                            Address so_addr(symbol_stub_addr, section_list);
1428
1429                                            if (stub_symbol->GetType() == eSymbolTypeExtern)
1430                                            {
1431                                                // Change the external symbol into a trampoline that makes sense
1432                                                // These symbols were N_UNDF N_EXT, and are useless to us, so we
1433                                                // can re-use them so we don't have to make up a synthetic symbol
1434                                                // for no good reason.
1435                                                stub_symbol->SetType (eSymbolTypeTrampoline);
1436                                                stub_symbol->SetExternal (false);
1437                                                stub_symbol->GetAddressRangeRef().GetBaseAddress() = so_addr;
1438                                                stub_symbol->GetAddressRangeRef().SetByteSize (symbol_stub_byte_size);
1439                                            }
1440                                            else
1441                                            {
1442                                                // Make a synthetic symbol to describe the trampoline stub
1443                                                if (sym_idx >= num_syms)
1444                                                    sym = symtab->Resize (++num_syms);
1445                                                sym[sym_idx].SetID (synthetic_stub_sym_id++);
1446                                                sym[sym_idx].GetMangled() = stub_symbol->GetMangled();
1447                                                sym[sym_idx].SetType (eSymbolTypeTrampoline);
1448                                                sym[sym_idx].SetIsSynthetic (true);
1449                                                sym[sym_idx].GetAddressRangeRef().GetBaseAddress() = so_addr;
1450                                                sym[sym_idx].GetAddressRangeRef().SetByteSize (symbol_stub_byte_size);
1451                                                ++sym_idx;
1452                                            }
1453                                        }
1454                                    }
1455                                }
1456                            }
1457                        }
1458                    }
1459                }
1460
1461                return symtab->GetNumSymbols();
1462            }
1463        }
1464        offset = cmd_offset + symtab_load_command.cmdsize;
1465    }
1466    return 0;
1467}
1468
1469
1470void
1471ObjectFileMachO::Dump (Stream *s)
1472{
1473    lldb_private::Mutex::Locker locker(m_mutex);
1474    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
1475    s->Indent();
1476    if (m_header.magic == HeaderMagic64 || m_header.magic == HeaderMagic64Swapped)
1477        s->PutCString("ObjectFileMachO64");
1478    else
1479        s->PutCString("ObjectFileMachO32");
1480
1481    ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
1482
1483    *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n";
1484
1485    if (m_sections_ap.get())
1486        m_sections_ap->Dump(s, NULL, true, UINT32_MAX);
1487
1488    if (m_symtab_ap.get())
1489        m_symtab_ap->Dump(s, NULL, eSortOrderNone);
1490}
1491
1492
1493bool
1494ObjectFileMachO::GetUUID (lldb_private::UUID* uuid)
1495{
1496    lldb_private::Mutex::Locker locker(m_mutex);
1497    struct uuid_command load_cmd;
1498    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
1499    uint32_t i;
1500    for (i=0; i<m_header.ncmds; ++i)
1501    {
1502        const uint32_t cmd_offset = offset;
1503        if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
1504            break;
1505
1506        if (load_cmd.cmd == LoadCommandUUID)
1507        {
1508            const uint8_t *uuid_bytes = m_data.PeekData(offset, 16);
1509            if (uuid_bytes)
1510            {
1511                uuid->SetBytes (uuid_bytes);
1512                return true;
1513            }
1514            return false;
1515        }
1516        offset = cmd_offset + load_cmd.cmdsize;
1517    }
1518    return false;
1519}
1520
1521
1522uint32_t
1523ObjectFileMachO::GetDependentModules (FileSpecList& files)
1524{
1525    lldb_private::Mutex::Locker locker(m_mutex);
1526    struct load_command load_cmd;
1527    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
1528    uint32_t count = 0;
1529    const bool resolve_path = false; // Don't resolve the dependend file paths since they may not reside on this system
1530    uint32_t i;
1531    for (i=0; i<m_header.ncmds; ++i)
1532    {
1533        const uint32_t cmd_offset = offset;
1534        if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
1535            break;
1536
1537        switch (load_cmd.cmd)
1538        {
1539        case LoadCommandDylibLoad:
1540        case LoadCommandDylibLoadWeak:
1541        case LoadCommandDylibReexport:
1542        case LoadCommandDynamicLinkerLoad:
1543        case LoadCommandFixedVMShlibLoad:
1544        case LoadCommandDylibLoadUpward:
1545            {
1546                uint32_t name_offset = cmd_offset + m_data.GetU32(&offset);
1547                const char *path = m_data.PeekCStr(name_offset);
1548                // Skip any path that starts with '@' since these are usually:
1549                // @executable_path/.../file
1550                // @rpath/.../file
1551                if (path && path[0] != '@')
1552                {
1553                    FileSpec file_spec(path, resolve_path);
1554                    if (files.AppendIfUnique(file_spec))
1555                        count++;
1556                }
1557            }
1558            break;
1559
1560        default:
1561            break;
1562        }
1563        offset = cmd_offset + load_cmd.cmdsize;
1564    }
1565    return count;
1566}
1567
1568lldb_private::Address
1569ObjectFileMachO::GetEntryPointAddress ()
1570{
1571    // If the object file is not an executable it can't hold the entry point.  m_entry_point_address
1572    // is initialized to an invalid address, so we can just return that.
1573    // If m_entry_point_address is valid it means we've found it already, so return the cached value.
1574
1575    if (!IsExecutable() || m_entry_point_address.IsValid())
1576        return m_entry_point_address;
1577
1578    // Otherwise, look for the UnixThread or Thread command.  The data for the Thread command is given in
1579    // /usr/include/mach-o.h, but it is basically:
1580    //
1581    //  uint32_t flavor  - this is the flavor argument you would pass to thread_get_state
1582    //  uint32_t count   - this is the count of longs in the thread state data
1583    //  struct XXX_thread_state state - this is the structure from <machine/thread_status.h> corresponding to the flavor.
1584    //  <repeat this trio>
1585    //
1586    // So we just keep reading the various register flavors till we find the GPR one, then read the PC out of there.
1587    // FIXME: We will need to have a "RegisterContext data provider" class at some point that can get all the registers
1588    // out of data in this form & attach them to a given thread.  That should underlie the MacOS X User process plugin,
1589    // and we'll also need it for the MacOS X Core File process plugin.  When we have that we can also use it here.
1590    //
1591    // For now we hard-code the offsets and flavors we need:
1592    //
1593    //
1594
1595    lldb_private::Mutex::Locker locker(m_mutex);
1596    struct load_command load_cmd;
1597    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
1598    uint32_t i;
1599    lldb::addr_t start_address = LLDB_INVALID_ADDRESS;
1600    bool done = false;
1601
1602    for (i=0; i<m_header.ncmds; ++i)
1603    {
1604        const uint32_t cmd_offset = offset;
1605        if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
1606            break;
1607
1608        switch (load_cmd.cmd)
1609        {
1610        case LoadCommandUnixThread:
1611        case LoadCommandThread:
1612            {
1613                while (offset < cmd_offset + load_cmd.cmdsize)
1614                {
1615                    uint32_t flavor = m_data.GetU32(&offset);
1616                    uint32_t count = m_data.GetU32(&offset);
1617                    if (count == 0)
1618                    {
1619                        // We've gotten off somehow, log and exit;
1620                        return m_entry_point_address;
1621                    }
1622
1623                    switch (m_header.cputype)
1624                    {
1625                    case llvm::MachO::CPUTypeARM:
1626                       if (flavor == 1) // ARM_THREAD_STATE from mach/arm/thread_status.h
1627                       {
1628                           offset += 60;  // This is the offset of pc in the GPR thread state data structure.
1629                           start_address = m_data.GetU32(&offset);
1630                           done = true;
1631                        }
1632                    break;
1633                    case llvm::MachO::CPUTypeI386:
1634                       if (flavor == 1) // x86_THREAD_STATE32 from mach/i386/thread_status.h
1635                       {
1636                           offset += 40;  // This is the offset of eip in the GPR thread state data structure.
1637                           start_address = m_data.GetU32(&offset);
1638                           done = true;
1639                        }
1640                    break;
1641                    case llvm::MachO::CPUTypeX86_64:
1642                       if (flavor == 4) // x86_THREAD_STATE64 from mach/i386/thread_status.h
1643                       {
1644                           offset += 16 * 8;  // This is the offset of rip in the GPR thread state data structure.
1645                           start_address = m_data.GetU64(&offset);
1646                           done = true;
1647                        }
1648                    break;
1649                    default:
1650                        return m_entry_point_address;
1651                    }
1652                    // Haven't found the GPR flavor yet, skip over the data for this flavor:
1653                    if (done)
1654                        break;
1655                    offset += count * 4;
1656                }
1657            }
1658            break;
1659
1660        default:
1661            break;
1662        }
1663        if (done)
1664            break;
1665
1666        // Go to the next load command:
1667        offset = cmd_offset + load_cmd.cmdsize;
1668    }
1669
1670    if (start_address != LLDB_INVALID_ADDRESS)
1671    {
1672        // We got the start address from the load commands, so now resolve that address in the sections
1673        // of this ObjectFile:
1674        if (!m_entry_point_address.ResolveAddressUsingFileSections (start_address, GetSectionList()))
1675        {
1676            m_entry_point_address.Clear();
1677        }
1678    }
1679    else
1680    {
1681        // We couldn't read the UnixThread load command - maybe it wasn't there.  As a fallback look for the
1682        // "start" symbol in the main executable.
1683
1684        SymbolContextList contexts;
1685        SymbolContext context;
1686        if (!m_module->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts))
1687            return m_entry_point_address;
1688
1689        contexts.GetContextAtIndex(0, context);
1690
1691        m_entry_point_address = context.symbol->GetValue();
1692    }
1693
1694    return m_entry_point_address;
1695
1696}
1697
1698ObjectFile::Type
1699ObjectFileMachO::CalculateType()
1700{
1701    switch (m_header.filetype)
1702    {
1703        case HeaderFileTypeObject:                                          // 0x1u MH_OBJECT
1704            if (GetAddressByteSize () == 4)
1705            {
1706                // 32 bit kexts are just object files, but they do have a valid
1707                // UUID load command.
1708                UUID uuid;
1709                if (GetUUID(&uuid))
1710                {
1711                    // this checking for the UUID load command is not enough
1712                    // we could eventually look for the symbol named
1713                    // "OSKextGetCurrentIdentifier" as this is required of kexts
1714                    if (m_strata == eStrataInvalid)
1715                        m_strata = eStrataKernel;
1716                    return eTypeSharedLibrary;
1717                }
1718            }
1719            return eTypeObjectFile;
1720
1721        case HeaderFileTypeExecutable:          return eTypeExecutable;     // 0x2u MH_EXECUTE
1722        case HeaderFileTypeFixedVMShlib:        return eTypeSharedLibrary;  // 0x3u MH_FVMLIB
1723        case HeaderFileTypeCore:                return eTypeCoreFile;       // 0x4u MH_CORE
1724        case HeaderFileTypePreloadedExecutable: return eTypeSharedLibrary;  // 0x5u MH_PRELOAD
1725        case HeaderFileTypeDynamicShlib:        return eTypeSharedLibrary;  // 0x6u MH_DYLIB
1726        case HeaderFileTypeDynamicLinkEditor:   return eTypeDynamicLinker;  // 0x7u MH_DYLINKER
1727        case HeaderFileTypeBundle:              return eTypeSharedLibrary;  // 0x8u MH_BUNDLE
1728        case HeaderFileTypeDynamicShlibStub:    return eTypeStubLibrary;    // 0x9u MH_DYLIB_STUB
1729        case HeaderFileTypeDSYM:                return eTypeDebugInfo;      // 0xAu MH_DSYM
1730        case HeaderFileTypeKextBundle:          return eTypeSharedLibrary;  // 0xBu MH_KEXT_BUNDLE
1731        default:
1732            break;
1733    }
1734    return eTypeUnknown;
1735}
1736
1737ObjectFile::Strata
1738ObjectFileMachO::CalculateStrata()
1739{
1740    switch (m_header.filetype)
1741    {
1742        case HeaderFileTypeObject:      // 0x1u MH_OBJECT
1743            {
1744                // 32 bit kexts are just object files, but they do have a valid
1745                // UUID load command.
1746                UUID uuid;
1747                if (GetUUID(&uuid))
1748                {
1749                    // this checking for the UUID load command is not enough
1750                    // we could eventually look for the symbol named
1751                    // "OSKextGetCurrentIdentifier" as this is required of kexts
1752                    if (m_type == eTypeInvalid)
1753                        m_type = eTypeSharedLibrary;
1754
1755                    return eStrataKernel;
1756                }
1757            }
1758            return eStrataUnknown;
1759
1760        case HeaderFileTypeExecutable:                                     // 0x2u MH_EXECUTE
1761            // Check for the MH_DYLDLINK bit in the flags
1762            if (m_header.flags & HeaderFlagBitIsDynamicLinkObject)
1763                return eStrataUser;
1764            return eStrataKernel;
1765
1766        case HeaderFileTypeFixedVMShlib:        return eStrataUser;         // 0x3u MH_FVMLIB
1767        case HeaderFileTypeCore:                return eStrataUnknown;      // 0x4u MH_CORE
1768        case HeaderFileTypePreloadedExecutable: return eStrataUser;         // 0x5u MH_PRELOAD
1769        case HeaderFileTypeDynamicShlib:        return eStrataUser;         // 0x6u MH_DYLIB
1770        case HeaderFileTypeDynamicLinkEditor:   return eStrataUser;         // 0x7u MH_DYLINKER
1771        case HeaderFileTypeBundle:              return eStrataUser;         // 0x8u MH_BUNDLE
1772        case HeaderFileTypeDynamicShlibStub:    return eStrataUser;         // 0x9u MH_DYLIB_STUB
1773        case HeaderFileTypeDSYM:                return eStrataUnknown;      // 0xAu MH_DSYM
1774        case HeaderFileTypeKextBundle:          return eStrataKernel;       // 0xBu MH_KEXT_BUNDLE
1775        default:
1776            break;
1777    }
1778    return eStrataUnknown;
1779}
1780
1781
1782bool
1783ObjectFileMachO::GetArchitecture (ArchSpec &arch)
1784{
1785    lldb_private::Mutex::Locker locker(m_mutex);
1786    arch.SetArchitecture (eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
1787    return true;
1788}
1789
1790
1791//------------------------------------------------------------------
1792// PluginInterface protocol
1793//------------------------------------------------------------------
1794const char *
1795ObjectFileMachO::GetPluginName()
1796{
1797    return "ObjectFileMachO";
1798}
1799
1800const char *
1801ObjectFileMachO::GetShortPluginName()
1802{
1803    return GetPluginNameStatic();
1804}
1805
1806uint32_t
1807ObjectFileMachO::GetPluginVersion()
1808{
1809    return 1;
1810}
1811
1812