ObjectFileMachO.cpp revision b62abd5162c166f81e5c9b473f754d957657b891
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ObjectFileMachO.cpp -------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103f69eacbb218a37390822c89d3675bd740590382Greg Clayton#include "llvm/ADT/StringRef.h"
112877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham#include "llvm/Support/MachO.h"
122877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ObjectFileMachO.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ArchSpec.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBuffer.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpecList.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
206f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton#include "lldb/Core/RangeMap.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UUID.h"
26df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
27df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/FileSpec.h"
283e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan#include "lldb/Symbol/ClangNamespaceDecl.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#include "lldb/Target/Platform.h"
31b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h"
3229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#include "lldb/Target/Target.h"
339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/Process/Utility/RegisterContextDarwin_arm.h"
349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/Process/Utility/RegisterContextDarwin_i386.h"
3546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "Plugins/Process/Utility/RegisterContextDarwin_x86_64.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonusing namespace llvm::MachO;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonclass RegisterContextDarwin_x86_64_Mach : public RegisterContextDarwin_x86_64
4246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonpublic:
4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    RegisterContextDarwin_x86_64_Mach (lldb_private::Thread &thread, const DataExtractor &data) :
4546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        RegisterContextDarwin_x86_64 (thread, 0)
4646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
4746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetRegisterDataFrom_LC_THREAD (data);
4846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
4946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual void
5146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    InvalidateAllRegisters ()
5246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
5346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // Do nothing... registers are always valid...
5446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
5546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    void
5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    SetRegisterDataFrom_LC_THREAD (const DataExtractor &data)
5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        uint32_t offset = 0;
6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetError (GPRRegSet, Read, -1);
6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetError (FPURegSet, Read, -1);
6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetError (EXCRegSet, Read, -1);
639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        bool done = false;
649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        while (!done)
6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            int flavor = data.GetU32 (&offset);
689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (flavor == 0)
699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                done = true;
709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            else
7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t i;
739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t count = data.GetU32 (&offset);
749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                switch (flavor)
759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                {
769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case GPRRegSet:
779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        for (i=0; i<count; ++i)
789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            (&gpr.rax)[i] = data.GetU64(&offset);
799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (GPRRegSet, Read, 0);
809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case FPURegSet:
849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // TODO: fill in FPU regs....
859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        //SetError (FPURegSet, Read, -1);
869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case EXCRegSet:
909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.trapno = data.GetU32(&offset);
919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.err = data.GetU32(&offset);
929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.faultvaddr = data.GetU64(&offset);
939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (EXCRegSet, Read, 0);
949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 7:
979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 8:
989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 9:
999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // fancy flavors that encapsulate of the the above
1009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // falvors...
1019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    default:
1049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
1059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                }
10746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
1089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
1099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1109ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonprotected:
1119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
1139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
1199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
1259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr)
1319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu)
1379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc)
1439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton};
14746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1499ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonclass RegisterContextDarwin_i386_Mach : public RegisterContextDarwin_i386
1509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
1519ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonpublic:
1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_i386_Mach (lldb_private::Thread &thread, const DataExtractor &data) :
1539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_i386 (thread, 0)
1549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetRegisterDataFrom_LC_THREAD (data);
1569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual void
1599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    InvalidateAllRegisters ()
1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Do nothing... registers are always valid...
1629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    void
1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    SetRegisterDataFrom_LC_THREAD (const DataExtractor &data)
1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        uint32_t offset = 0;
1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (GPRRegSet, Read, -1);
1699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (FPURegSet, Read, -1);
1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (EXCRegSet, Read, -1);
1719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        bool done = false;
1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        while (!done)
1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            int flavor = data.GetU32 (&offset);
1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (flavor == 0)
1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                done = true;
1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            else
17946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t i;
1819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t count = data.GetU32 (&offset);
1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                switch (flavor)
1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                {
1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case GPRRegSet:
1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        for (i=0; i<count; ++i)
1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            (&gpr.eax)[i] = data.GetU32(&offset);
1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (GPRRegSet, Read, 0);
1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case FPURegSet:
1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // TODO: fill in FPU regs....
1939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        //SetError (FPURegSet, Read, -1);
1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case EXCRegSet:
1989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.trapno = data.GetU32(&offset);
1999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.err = data.GetU32(&offset);
2009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.faultvaddr = data.GetU32(&offset);
2019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (EXCRegSet, Read, 0);
2029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
2039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 7:
2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 8:
2069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 9:
2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // fancy flavors that encapsulate of the the above
2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // falvors...
2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    default:
2129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                }
21546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
21646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
21746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
21846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonprotected:
21946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
22046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
22146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
22246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
22346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
22446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
22546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
22746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
23046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
23146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
23246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
23346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
23446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
23546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
23646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
23746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
23846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr)
23946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
24146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
24246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
24346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
24446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu)
24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
25046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc)
25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
25346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
25446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton};
25546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
2569ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonclass RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm
2579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
2589ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonpublic:
2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_arm_Mach (lldb_private::Thread &thread, const DataExtractor &data) :
2609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_arm (thread, 0)
2619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetRegisterDataFrom_LC_THREAD (data);
2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual void
2669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    InvalidateAllRegisters ()
2679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Do nothing... registers are always valid...
2699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    void
2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    SetRegisterDataFrom_LC_THREAD (const DataExtractor &data)
2739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        uint32_t offset = 0;
2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (GPRRegSet, Read, -1);
2769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (FPURegSet, Read, -1);
2779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (EXCRegSet, Read, -1);
2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        int flavor = data.GetU32 (&offset);
2799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        uint32_t count = data.GetU32 (&offset);
2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        switch (flavor)
2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            case GPRRegSet:
2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                for (uint32_t i=0; i<count; ++i)
2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    gpr.r[i] = data.GetU32(&offset);
2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                SetError (GPRRegSet, Read, 0);
2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                break;
2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            case FPURegSet:
2889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // TODO: fill in FPU regs....
2899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                //SetError (FPURegSet, Read, -1);
2909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                break;
2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            case EXCRegSet:
2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                exc.exception = data.GetU32(&offset);
2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                exc.fsr = data.GetU32(&offset);
2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                exc.far = data.GetU32(&offset);
2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                SetError (EXCRegSet, Read, 0);
2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                break;
2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonprotected:
3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
3149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr)
3209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu)
3269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc)
3329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton};
3369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#define MACHO_NLIST_ARM_SYMBOL_IS_THUMB 0x0008
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::Initialize()
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::RegisterPlugin (GetPluginNameStatic(),
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   GetPluginDescriptionStatic(),
344b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                   CreateInstance,
345b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                   CreateMemoryInstance);
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::Terminate()
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginNameStatic()
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "object-file.mach-o";
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginDescriptionStatic()
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "Mach-o object file reader (32 and 64 bit)";
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
3693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileMachO::CreateInstance (const lldb::ModuleSP &module_sp, DataBufferSP& data_sp, const FileSpec* file, addr_t offset, addr_t length)
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
371db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    if (ObjectFileMachO::MagicBytesMatch(data_sp, offset, length))
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3733508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        std::auto_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module_sp, data_sp, file, offset, length));
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (objfile_ap.get() && objfile_ap->ParseHeader())
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return objfile_ap.release();
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile *
3813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileMachO::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
382b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                       DataBufferSP& data_sp,
383b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                       const ProcessSP &process_sp,
384b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                       lldb::addr_t header_addr)
385b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
386b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (ObjectFileMachO::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
387b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        std::auto_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module_sp, data_sp, process_sp, header_addr));
389b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (objfile_ap.get() && objfile_ap->ParseHeader())
390b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            return objfile_ap.release();
391b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
392b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return NULL;
393b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
394b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
395b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
396b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
397b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameTEXT()
398b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
399b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_segment_name_TEXT ("__TEXT");
400b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_segment_name_TEXT;
401b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
402b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
403b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
404b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameDATA()
405b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
406b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_segment_name_DATA ("__DATA");
407b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_segment_name_DATA;
408b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
409b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
410b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
411b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameOBJC()
412b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
413b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_segment_name_OBJC ("__OBJC");
414b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_segment_name_OBJC;
415b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
416b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
417b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
418b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameLINKEDIT()
419b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
420b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_section_name_LINKEDIT ("__LINKEDIT");
421b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_section_name_LINKEDIT;
422b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
423b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
424b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
425b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSectionNameEHFrame()
426b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
427b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_section_name_eh_frame ("__eh_frame");
428b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_section_name_eh_frame;
429b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
430b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
431b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMachHeaderSizeFromMagic(uint32_t magic)
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (magic)
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case HeaderMagic32:
4391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case HeaderMagic32Swapped:
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return sizeof(struct mach_header);
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case HeaderMagic64:
4431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case HeaderMagic64Swapped:
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return sizeof(struct mach_header_64);
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
455db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFileMachO::MagicBytesMatch (DataBufferSP& data_sp,
456db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                                  lldb::addr_t data_offset,
457db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                                  lldb::addr_t data_length)
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
459db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    DataExtractor data;
460db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    data.SetData (data_sp, data_offset, data_length);
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t offset = 0;
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t magic = data.GetU32(&offset);
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return MachHeaderSizeFromMagic(magic) != 0;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileMachO::ObjectFileMachO(const lldb::ModuleSP &module_sp, DataBufferSP& data_sp, const FileSpec* file, addr_t offset, addr_t length) :
4683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    ObjectFile(module_sp, file, offset, length, data_sp),
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_sections_ap(),
4702877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    m_symtab_ap(),
47146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_segments(),
47246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_sections(),
47346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_entry_point_address(),
47446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets(),
47546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets_valid(false)
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
477ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton    ::memset (&m_header, 0, sizeof(m_header));
478ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton    ::memset (&m_dysymtab, 0, sizeof(m_dysymtab));
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileMachO::ObjectFileMachO (const lldb::ModuleSP &module_sp,
482b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                  lldb::DataBufferSP& header_data_sp,
483b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                  const lldb::ProcessSP &process_sp,
484b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                  lldb::addr_t header_addr) :
4853508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
486b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_sections_ap(),
487b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_symtab_ap(),
48846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_segments(),
48946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_sections(),
49046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_entry_point_address(),
49146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets(),
49246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets_valid(false)
493b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
494b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ::memset (&m_header, 0, sizeof(m_header));
495b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ::memset (&m_dysymtab, 0, sizeof(m_dysymtab));
496b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::~ObjectFileMachO()
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::ParseHeader ()
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
5079482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5099482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
5109482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        bool can_parse = false;
5119482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t offset = 0;
512cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton        m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
5139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // Leave magic in the original byte order
5149482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        m_header.magic = m_data.GetU32(&offset);
5159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        switch (m_header.magic)
5169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
5179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic32:
5189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
5199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(4);
5209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
5219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic64:
5249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
5259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(8);
5269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
5279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic32Swapped:
5309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
5319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(4);
5329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
5339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic64Swapped:
5369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
5379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(8);
5389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
5399482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        default:
5429482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
5439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5459482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (can_parse)
546b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
5479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.GetU32(&offset, &m_header.cputype, 6);
5489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
5499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ArchSpec mach_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
5509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
5519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (SetModulesArchitecture (mach_arch))
552b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
5539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const size_t header_and_lc_size = m_header.sizeofcmds + MachHeaderSizeFromMagic(m_header.magic);
5549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (m_data.GetByteSize() < header_and_lc_size)
555b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                {
5569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    DataBufferSP data_sp;
5579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    ProcessSP process_sp (m_process_wp.lock());
5589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (process_sp)
5599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
5609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        data_sp = ReadMemory (process_sp, m_offset, header_and_lc_size);
5619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
5629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    else
5639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
5649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // Read in all only the load command data from the file on disk
5659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        data_sp = m_file.ReadFileContents(m_offset, header_and_lc_size);
5669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (data_sp->GetByteSize() != header_and_lc_size)
5679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            return false;
5689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
5699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (data_sp)
5709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        m_data.SetData (data_sp);
571b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                }
572b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
5739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            return true;
5749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
5759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        else
5769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
5779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            memset(&m_header, 0, sizeof(struct mach_header));
578b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerByteOrder
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetByteOrder () const
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.GetByteOrder ();
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5907508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
5917508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFileMachO::IsExecutable() const
5927508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
5937508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return m_header.filetype == HeaderFileTypeExecutable;
5947508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetAddressByteSize () const
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.GetAddressByteSize ();
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
602b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressClass
603b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonObjectFileMachO::GetAddressClass (lldb::addr_t file_addr)
604b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
605b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Symtab *symtab = GetSymtab();
606b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (symtab)
607b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
608b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
609b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (symbol)
610b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
6110c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton            if (symbol->ValueIsAddress())
612b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
6130c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                SectionSP section_sp (symbol->GetAddress().GetSection());
6143508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                if (section_sp)
615b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
6163508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    const SectionType section_type = section_sp->GetType();
617b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    switch (section_type)
618b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
619b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeInvalid:               return eAddressClassUnknown;
620b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeCode:
621b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        if (m_header.cputype == llvm::MachO::CPUTypeARM)
622b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        {
623b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            // For ARM we have a bit in the n_desc field of the symbol
624b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            // that tells us ARM/Thumb which is bit 0x0008.
625b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
626b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                return eAddressClassCodeAlternateISA;
627b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        }
628b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return eAddressClassCode;
629b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
630b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeContainer:             return eAddressClassUnknown;
63124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData:
63224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCString:
63324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCStringPointers:
63424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataSymbolAddress:
63524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData4:
63624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData8:
63724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData16:
63824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataPointers:
63924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeZeroFill:
64024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCMessageRefs:
64124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCCFStrings:
64224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassData;
64324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDebug:
64424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAbbrev:
64524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAranges:
64624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugFrame:
64724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugInfo:
64824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLine:
64924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLoc:
65024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugMacInfo:
65124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubNames:
65224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubTypes:
65324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugRanges:
65424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugStr:
65524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNames:
65624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleTypes:
65724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNamespaces:
65824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleObjC:
65924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassDebug;
660b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeEHFrame:               return eAddressClassRuntime;
661b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeOther:                 return eAddressClassUnknown;
662b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
663b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
664b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
665b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
666b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const SymbolType symbol_type = symbol->GetType();
667b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            switch (symbol_type)
668b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
669b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAny:            return eAddressClassUnknown;
670b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAbsolute:       return eAddressClassUnknown;
671b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
672b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCode:
673b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeTrampoline:
674b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (m_header.cputype == llvm::MachO::CPUTypeARM)
675b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
676b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    // For ARM we have a bit in the n_desc field of the symbol
677b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    // that tells us ARM/Thumb which is bit 0x0008.
678b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
679b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return eAddressClassCodeAlternateISA;
680b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
681b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return eAddressClassCode;
682b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
683b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeData:           return eAddressClassData;
684b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeRuntime:        return eAddressClassRuntime;
685b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeException:      return eAddressClassRuntime;
686b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeSourceFile:     return eAddressClassDebug;
687b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeHeaderFile:     return eAddressClassDebug;
688b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeObjectFile:     return eAddressClassDebug;
689b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCommonBlock:    return eAddressClassDebug;
690b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeBlock:          return eAddressClassDebug;
691b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLocal:          return eAddressClassData;
692b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeParam:          return eAddressClassData;
693b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariable:       return eAddressClassData;
694b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariableType:   return eAddressClassDebug;
695b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineEntry:      return eAddressClassDebug;
696b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineHeader:     return eAddressClassDebug;
697b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeBegin:     return eAddressClassDebug;
698b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeEnd:       return eAddressClassDebug;
699b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAdditional:     return eAddressClassUnknown;
700b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCompiler:       return eAddressClassDebug;
701b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeInstrumentation:return eAddressClassDebug;
702b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeUndefined:      return eAddressClassUnknown;
7033f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCClass:      return eAddressClassRuntime;
7043f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCMetaClass:  return eAddressClassRuntime;
7053f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCIVar:       return eAddressClassRuntime;
706b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
707b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
708b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
709b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return eAddressClassUnknown;
710b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymtab *
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetSymtab()
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
7169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
7199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_symtab_ap.get() == NULL)
7209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
7219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap.reset(new Symtab(this));
7229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            Mutex::Locker symtab_locker (m_symtab_ap->GetMutex());
7239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ParseSymtab (true);
7249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap->Finalize ();
7259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symtab_ap.get();
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSectionList *
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetSectionList()
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
7359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
7389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_sections_ap.get() == NULL)
7399482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
7409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_sections_ap.reset(new SectionList());
7419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ParseSections();
7429482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_sections_ap.get();
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::ParseSections ()
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t segID = 0;
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t sectID = 0;
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t i;
75546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    const bool is_core = GetType() == eTypeCoreFile;
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //bool dump_sections = false;
7573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    ModuleSP module_sp (GetModule());
7586f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    // First look up any LC_ENCRYPTION_INFO load commands
7596f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    typedef RangeArray<uint32_t, uint32_t, 8> EncryptedFileRanges;
7606f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    EncryptedFileRanges encrypted_file_ranges;
76154e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton    encryption_info_command encryption_cmd;
7626f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    for (i=0; i<m_header.ncmds; ++i)
7636f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    {
7646f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton        const uint32_t load_cmd_offset = offset;
76554e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton        if (m_data.GetU32(&offset, &encryption_cmd, 2) == NULL)
7666f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton            break;
7676f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton
76854e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton        if (encryption_cmd.cmd == LoadCommandEncryptionInfo)
7696f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton        {
77054e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton            if (m_data.GetU32(&offset, &encryption_cmd.cryptoff, 3))
77154e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton            {
77254e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                if (encryption_cmd.cryptid != 0)
77354e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                {
77454e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                    EncryptedFileRanges::Entry entry;
77554e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                    entry.SetRangeBase(encryption_cmd.cryptoff);
77654e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                    entry.SetByteSize(encryption_cmd.cryptsize);
77754e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                    encrypted_file_ranges.Append(entry);
77854e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                }
77954e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton            }
7806f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton        }
78154e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton        offset = load_cmd_offset + encryption_cmd.cmdsize;
7826f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    }
7836f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton
7846f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    offset = MachHeaderSizeFromMagic(m_header.magic);
7856f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton
78654e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton    struct segment_command_64 load_cmd;
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (i=0; i<m_header.ncmds; ++i)
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t load_cmd_offset = offset;
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        if (load_cmd.cmd == LoadCommandSegment32 || load_cmd.cmd == LoadCommandSegment64)
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_data.GetU8(&offset, (uint8_t*)load_cmd.segname, 16))
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_cmd.vmaddr = m_data.GetAddress(&offset);
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_cmd.vmsize = m_data.GetAddress(&offset);
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_cmd.fileoff = m_data.GetAddress(&offset);
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_cmd.filesize = m_data.GetAddress(&offset);
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_data.GetU32(&offset, &load_cmd.maxprot, 4))
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
80368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
80468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                    const bool segment_is_encrypted = (load_cmd.flags & SegmentCommandFlagBitProtectedVersion1) != 0;
80568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Keep a list of mach segments around in case we need to
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // get at data that isn't stored in the abstracted Sections.
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_mach_segments.push_back (load_cmd);
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ConstString segment_name (load_cmd.segname, std::min<int>(strlen(load_cmd.segname), sizeof(load_cmd.segname)));
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Use a segment ID of the segment index shifted left by 8 so they
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // never conflict with any of the sections.
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionSP segment_sp;
81446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    if (segment_name || is_core)
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
8166f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton                        segment_sp.reset(new Section (module_sp,              // Module to which this section belongs
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      ++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
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      segment_name,           // Name of this section
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      eSectionTypeContainer,  // This section is a container of other sections.
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      load_cmd.vmaddr,        // File VM address == addresses as they are found in the object file
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      load_cmd.vmsize,        // VM size in bytes of this section
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      load_cmd.fileoff,       // Offset to the data for this section in the file
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      load_cmd.filesize,      // Size in bytes of this section as found in the the file
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      load_cmd.flags));       // Flags for this section
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                        segment_sp->SetIsEncrypted (segment_is_encrypted);
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_sections_ap->AddSection(segment_sp);
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    struct section_64 sect64;
831ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton                    ::memset (&sect64, 0, sizeof(sect64));
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Push a section into our mach sections for the section at
8336af4fad40d2d2a5aaa7da3112000af89b8cf3298Greg Clayton                    // index zero (NListSectionNoSection) if we don't have any
8346af4fad40d2d2a5aaa7da3112000af89b8cf3298Greg Clayton                    // mach sections yet...
8356af4fad40d2d2a5aaa7da3112000af89b8cf3298Greg Clayton                    if (m_mach_sections.empty())
8366af4fad40d2d2a5aaa7da3112000af89b8cf3298Greg Clayton                        m_mach_sections.push_back(sect64);
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t segment_sect_idx;
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const lldb::user_id_t first_segment_sectID = sectID + 1;
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    const uint32_t num_u32s = load_cmd.cmd == LoadCommandSegment32 ? 7 : 8;
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (segment_sect_idx=0; segment_sect_idx<load_cmd.nsects; ++segment_sect_idx)
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (m_data.GetU8(&offset, (uint8_t*)sect64.sectname, sizeof(sect64.sectname)) == NULL)
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (m_data.GetU8(&offset, (uint8_t*)sect64.segname, sizeof(sect64.segname)) == NULL)
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sect64.addr = m_data.GetAddress(&offset);
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sect64.size = m_data.GetAddress(&offset);
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (m_data.GetU32(&offset, &sect64.offset, num_u32s) == NULL)
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Keep a list of mach sections around in case we need to
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // get at data that isn't stored in the abstracted Sections.
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_mach_sections.push_back (sect64);
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ConstString section_name (sect64.sectname, std::min<size_t>(strlen(sect64.sectname), sizeof(sect64.sectname)));
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (!segment_name)
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // We have a segment with no name so we need to conjure up
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // segments that correspond to the section's segname if there
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // isn't already such a section. If there is such a section,
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // we resize the section so that it spans all sections.
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // We also mark these sections as fake so address matches don't
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // hit if they land in the gaps between the child sections.
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            segment_name.SetTrimmedCStringWithLength(sect64.segname, sizeof(sect64.segname));
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            segment_sp = m_sections_ap->FindSectionByName (segment_name);
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (segment_sp.get())
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Section *segment = segment_sp.get();
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Grow the section size as needed.
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb::addr_t sect64_min_addr = sect64.addr;
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb::addr_t sect64_max_addr = sect64_min_addr + sect64.size;
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb::addr_t curr_seg_byte_size = segment->GetByteSize();
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb::addr_t curr_seg_min_addr = segment->GetFileAddress();
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const lldb::addr_t curr_seg_max_addr = curr_seg_min_addr + curr_seg_byte_size;
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (sect64_min_addr >= curr_seg_min_addr)
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    const lldb::addr_t new_seg_byte_size = sect64_max_addr - curr_seg_min_addr;
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // Only grow the section size if needed
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (new_seg_byte_size > curr_seg_byte_size)
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        segment->SetByteSize (new_seg_byte_size);
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // We need to change the base address of the segment and
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // adjust the child section offsets for all existing children.
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    const lldb::addr_t slide_amount = sect64_min_addr - curr_seg_min_addr;
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    segment->Slide(slide_amount, false);
891716a6647382d32ea9859027f7eea07e6ff2acf76Sean Callanan                                    segment->GetChildren().Slide(-slide_amount, false);
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    segment->SetByteSize (curr_seg_max_addr - sect64_min_addr);
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
894661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton
895661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                // Grow the section size as needed.
896661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                if (sect64.offset)
897661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                {
898661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    const lldb::addr_t segment_min_file_offset = segment->GetFileOffset();
899661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    const lldb::addr_t segment_max_file_offset = segment_min_file_offset + segment->GetFileSize();
900661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton
901661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    const lldb::addr_t section_min_file_offset = sect64.offset;
902661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    const lldb::addr_t section_max_file_offset = section_min_file_offset + sect64.size;
903661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    const lldb::addr_t new_file_offset = std::min (section_min_file_offset, segment_min_file_offset);
904661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    const lldb::addr_t new_file_size = std::max (section_max_file_offset, segment_max_file_offset) - new_file_offset;
905661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    segment->SetFileOffset (new_file_offset);
906661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                    segment->SetFileSize (new_file_size);
907661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                }
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Create a fake section for the section's named segment
9123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                segment_sp.reset(new Section (segment_sp,            // Parent section
9133508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              module_sp,           // Module to which this section belongs
9143508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              ++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
9153508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              segment_name,          // Name of this section
9163508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              eSectionTypeContainer, // This section is a container of other sections.
9173508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              sect64.addr,           // File VM address == addresses as they are found in the object file
9183508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              sect64.size,           // VM size in bytes of this section
9193508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              sect64.offset,         // Offset to the data for this section in the file
9203508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              sect64.offset ? sect64.size : 0,        // Size in bytes of this section as found in the the file
9213508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                              load_cmd.flags));      // Flags for this section
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                segment_sp->SetIsFake(true);
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_sections_ap->AddSection(segment_sp);
92468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                                segment_sp->SetIsEncrypted (segment_is_encrypted);
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert (segment_sp.get());
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        uint32_t mach_sect_type = sect64.flags & SectionFlagMaskSectionType;
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_data ("__objc_data");
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_msgrefs ("__objc_msgrefs");
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_selrefs ("__objc_selrefs");
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_classrefs ("__objc_classrefs");
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_superrefs ("__objc_superrefs");
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_const ("__objc_const");
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_objc_classlist ("__objc_classlist");
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        static ConstString g_sect_name_cfstring ("__cfstring");
93832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton
93932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_abbrev ("__debug_abbrev");
94032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_aranges ("__debug_aranges");
94132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_frame ("__debug_frame");
94232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_info ("__debug_info");
94332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_line ("__debug_line");
94432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_loc ("__debug_loc");
94532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_macinfo ("__debug_macinfo");
94632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_pubnames ("__debug_pubnames");
94732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_pubtypes ("__debug_pubtypes");
94832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_ranges ("__debug_ranges");
94932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_dwarf_debug_str ("__debug_str");
950f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton                        static ConstString g_sect_name_dwarf_apple_names ("__apple_names");
951f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton                        static ConstString g_sect_name_dwarf_apple_types ("__apple_types");
95200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                        static ConstString g_sect_name_dwarf_apple_namespaces ("__apple_namespac");
95324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        static ConstString g_sect_name_dwarf_apple_objc ("__apple_objc");
95432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        static ConstString g_sect_name_eh_frame ("__eh_frame");
9553fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                        static ConstString g_sect_name_DATA ("__DATA");
9563fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                        static ConstString g_sect_name_TEXT ("__TEXT");
95732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        SectionType sect_type = eSectionTypeOther;
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        if (section_name == g_sect_name_dwarf_debug_abbrev)
96132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugAbbrev;
96232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_aranges)
96332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugAranges;
96432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_frame)
96532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugFrame;
96632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_info)
96732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugInfo;
96832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_line)
96932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugLine;
97032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_loc)
97132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugLoc;
97232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_macinfo)
97332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugMacInfo;
97432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_pubnames)
97532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugPubNames;
97632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_pubtypes)
97732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugPubTypes;
97832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_ranges)
97932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugRanges;
98032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_dwarf_debug_str)
98132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDWARFDebugStr;
982f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton                        else if (section_name == g_sect_name_dwarf_apple_names)
983f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton                            sect_type = eSectionTypeDWARFAppleNames;
984f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton                        else if (section_name == g_sect_name_dwarf_apple_types)
985f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton                            sect_type = eSectionTypeDWARFAppleTypes;
98600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                        else if (section_name == g_sect_name_dwarf_apple_namespaces)
98700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton                            sect_type = eSectionTypeDWARFAppleNamespaces;
98824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        else if (section_name == g_sect_name_dwarf_apple_objc)
98924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                            sect_type = eSectionTypeDWARFAppleObjC;
99032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_objc_selrefs)
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            sect_type = eSectionTypeDataCStringPointers;
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (section_name == g_sect_name_objc_msgrefs)
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            sect_type = eSectionTypeDataObjCMessageRefs;
99432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_eh_frame)
99532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeEHFrame;
99632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                        else if (section_name == g_sect_name_cfstring)
99732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton                            sect_type = eSectionTypeDataObjCCFStrings;
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (section_name == g_sect_name_objc_data ||
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 section_name == g_sect_name_objc_classrefs ||
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 section_name == g_sect_name_objc_superrefs ||
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 section_name == g_sect_name_objc_const ||
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 section_name == g_sect_name_objc_classlist)
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            sect_type = eSectionTypeDataPointers;
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sect_type == eSectionTypeOther)
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            switch (mach_sect_type)
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // TODO: categorize sections by other flags for regular sections
10123fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                            case SectionTypeRegular:
10133fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                if (segment_sp->GetName() == g_sect_name_TEXT)
10143fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                    sect_type = eSectionTypeCode;
10153fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                else if (segment_sp->GetName() == g_sect_name_DATA)
10163fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                    sect_type = eSectionTypeData;
10173fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                else
10183fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                    sect_type = eSectionTypeOther;
10193fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton                                break;
10201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeZeroFill:                   sect_type = eSectionTypeZeroFill; break;
10211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeCStringLiterals:            sect_type = eSectionTypeDataCString;    break; // section with only literal C strings
10221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionType4ByteLiterals:              sect_type = eSectionTypeData4;    break; // section with only 4 byte literals
10231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionType8ByteLiterals:              sect_type = eSectionTypeData8;    break; // section with only 8 byte literals
10241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeLiteralPointers:            sect_type = eSectionTypeDataPointers;  break; // section with only pointers to literals
10251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeNonLazySymbolPointers:      sect_type = eSectionTypeDataPointers;  break; // section with only non-lazy symbol pointers
10261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeLazySymbolPointers:         sect_type = eSectionTypeDataPointers;  break; // section with only lazy symbol pointers
10271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeSymbolStubs:                sect_type = eSectionTypeCode;  break; // section with only symbol stubs, byte size of stub in the reserved2 field
10281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeModuleInitFunctionPointers: sect_type = eSectionTypeDataPointers;    break; // section with only function pointers for initialization
10291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeModuleTermFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for termination
10301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeCoalesced:                  sect_type = eSectionTypeOther; break;
10311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeZeroFillLarge:              sect_type = eSectionTypeZeroFill; break;
10321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeInterposing:                sect_type = eSectionTypeCode;  break; // section with only pairs of function pointers for interposing
10331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionType16ByteLiterals:             sect_type = eSectionTypeData16; break; // section with only 16 byte literals
10341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeDTraceObjectFormat:         sect_type = eSectionTypeDebug; break;
10351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                            case SectionTypeLazyDylibSymbolPointers:    sect_type = eSectionTypeDataPointers;  break;
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            default: break;
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10403508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                        SectionSP section_sp(new Section (segment_sp,
10413508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          module_sp,
10423508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          ++sectID,
10433508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          section_name,
10443508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          sect_type,
10453508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          sect64.addr - segment_sp->GetFileAddress(),
10463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          sect64.size,
10473508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          sect64.offset,
10483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          sect64.offset == 0 ? 0 : sect64.size,
10493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                          sect64.flags));
105068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                        // Set the section to be encrypted to match the segment
10516f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton
10526f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton                        bool section_is_encrypted = false;
10536f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton                        if (!segment_is_encrypted && load_cmd.filesize != 0)
10546f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton                            section_is_encrypted = encrypted_file_ranges.FindEntryThatContains(sect64.offset) != NULL;
105568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
10566f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton                        section_sp->SetIsEncrypted (segment_is_encrypted || section_is_encrypted);
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        segment_sp->GetChildren().AddSection(section_sp);
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (segment_sp->IsFake())
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            segment_sp.reset();
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            segment_name.Clear();
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
10650fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton                    if (segment_sp && m_header.filetype == HeaderFileTypeDSYM)
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (first_segment_sectID <= sectID)
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            lldb::user_id_t sect_uid;
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (sect_uid = first_segment_sectID; sect_uid <= sectID; ++sect_uid)
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SectionSP curr_section_sp(segment_sp->GetChildren().FindSectionByID (sect_uid));
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SectionSP next_section_sp;
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (sect_uid + 1 <= sectID)
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    next_section_sp = segment_sp->GetChildren().FindSectionByID (sect_uid+1);
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (curr_section_sp.get())
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (curr_section_sp->GetByteSize() == 0)
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        if (next_section_sp.get() != NULL)
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            curr_section_sp->SetByteSize ( next_section_sp->GetFileAddress() - curr_section_sp->GetFileAddress() );
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        else
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            curr_section_sp->SetByteSize ( load_cmd.vmsize );
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        else if (load_cmd.cmd == LoadCommandDynamicSymtabInfo)
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dysymtab.cmd = load_cmd.cmd;
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dysymtab.cmdsize = load_cmd.cmdsize;
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data.GetU32 (&offset, &m_dysymtab.ilocalsym, (sizeof(m_dysymtab) / sizeof(uint32_t)) - 2);
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        offset = load_cmd_offset + load_cmd.cmdsize;
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (dump_sections)
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        StreamFile s(stdout);
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        m_sections_ap->Dump(&s, true);
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sectID;  // Return the number of sections we registered with the module
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachSymtabSectionInfo
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachSymtabSectionInfo (SectionList *section_list) :
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_section_list (section_list),
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_section_infos()
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get the number of sections down to a depth of 1 to include
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // all segments and their sections, but no other sections that
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // may be added for debug map or
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_section_infos.resize(section_list->GetNumSections(1));
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSection (uint8_t n_sect, addr_t file_addr)
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (n_sect == 0)
11293508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            return SectionSP();
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (n_sect < m_section_infos.size())
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11323508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            if (!m_section_infos[n_sect].section_sp)
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
11343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                SectionSP section_sp (m_section_list->FindSectionByID (n_sect));
11353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                m_section_infos[n_sect].section_sp = section_sp;
11363508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                if (section_sp != NULL)
11375638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                {
11383508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    m_section_infos[n_sect].vm_range.SetBaseAddress (section_sp->GetFileAddress());
11393508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    m_section_infos[n_sect].vm_range.SetByteSize (section_sp->GetByteSize());
11405638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                }
11415638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                else
11425638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                {
1143df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                    Host::SystemLog (Host::eSystemLogError, "error: unable to find section for section %u\n", n_sect);
11445638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                }
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_section_infos[n_sect].vm_range.Contains(file_addr))
1147811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            {
1148811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // Symbol is in section.
11493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                return m_section_infos[n_sect].section_sp;
1150811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            }
1151811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            else if (m_section_infos[n_sect].vm_range.GetByteSize () == 0 &&
1152811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                     m_section_infos[n_sect].vm_range.GetBaseAddress() == file_addr)
1153811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            {
1154811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // Symbol is in section with zero size, but has the same start
1155811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // address as the section. This can happen with linker symbols
1156811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // (symbols that start with the letter 'l' or 'L'.
11573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                return m_section_infos[n_sect].section_sp;
1158811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            }
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        return m_section_list->FindSectionContainingFileAddress(file_addr);
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct SectionInfo
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SectionInfo () :
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            vm_range(),
11683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            section_sp ()
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        VMRange vm_range;
11733508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        SectionSP section_sp;
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SectionList *m_section_list;
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<SectionInfo> m_section_infos;
117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::ParseSymtab (bool minimize)
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "ObjectFileMachO::ParseSymtab () module = %s",
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       m_file.GetFilename().AsCString(""));
11854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    ModuleSP module_sp (GetModule());
11864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    if (!module_sp)
11874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        return 0;
11884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
11894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    struct symtab_command symtab_load_command = { 0, 0, 0, 0, 0, 0 };
11904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    struct linkedit_data_command function_starts_load_command = { 0, 0, 0, 0 };
11914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    typedef AddressDataArray<lldb::addr_t, bool, 100> FunctionStarts;
11924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    FunctionStarts function_starts;
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t i;
11954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
11960fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
11970fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (i=0; i<m_header.ncmds; ++i)
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t cmd_offset = offset;
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Read in the load command and load command size
12024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        struct load_command lc;
12034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (m_data.GetU32(&offset, &lc, 2) == NULL)
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Watch for the symbol table load command
12064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        switch (lc.cmd)
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        case LoadCommandSymtab:
12094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            symtab_load_command.cmd = lc.cmd;
12104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            symtab_load_command.cmdsize = lc.cmdsize;
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Read in the rest of the symtab load command
12124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (m_data.GetU32(&offset, &symtab_load_command.symoff, 4) == 0) // fill in symoff, nsyms, stroff, strsize fields
12134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
12144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.symoff == 0)
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
12164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
12174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    module_sp->LogMessage(log.get(), "LC_SYMTAB.symoff == 0");
12184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
12194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
1220b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
12214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.stroff == 0)
12224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
12234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
12244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    module_sp->LogMessage(log.get(), "LC_SYMTAB.stroff == 0");
12254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
12264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
12274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
12284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.nsyms == 0)
12294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
12304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
12314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    module_sp->LogMessage(log.get(), "LC_SYMTAB.nsyms == 0");
12324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
12334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
12344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
12354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.strsize == 0)
12364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
12374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
12384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    module_sp->LogMessage(log.get(), "LC_SYMTAB.strsize == 0");
12394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
12404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
12414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            break;
12420fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
12434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        case LoadCommandFunctionStarts:
12444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_starts_load_command.cmd = lc.cmd;
12454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_starts_load_command.cmdsize = lc.cmdsize;
12464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (m_data.GetU32(&offset, &function_starts_load_command.dataoff, 2) == NULL) // fill in symoff, nsyms, stroff, strsize fields
12474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                bzero (&function_starts_load_command, sizeof(function_starts_load_command));
12484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            break;
1249b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
12504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        default:
12514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            break;
12524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
12534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        offset = cmd_offset + lc.cmdsize;
12544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    }
1255b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
12564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    if (symtab_load_command.cmd)
12574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    {
12584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        Symtab *symtab = m_symtab_ap.get();
12594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionList *section_list = GetSectionList();
12604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (section_list == NULL)
12614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            return 0;
1262b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
12634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        ProcessSP process_sp (m_process_wp.lock());
1264dd29b97f71187509df339596c3397dea0e429754Greg Clayton        Process *process = process_sp.get();
12650fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
12664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const size_t addr_byte_size = m_data.GetAddressByteSize();
12674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        bool bit_width_32 = addr_byte_size == 4;
12684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const size_t nlist_byte_size = bit_width_32 ? sizeof(struct nlist) : sizeof(struct nlist_64);
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        DataExtractor nlist_data (NULL, 0, m_data.GetByteOrder(), m_data.GetAddressByteSize());
12714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        DataExtractor strtab_data (NULL, 0, m_data.GetByteOrder(), m_data.GetAddressByteSize());
12724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        DataExtractor function_starts_data (NULL, 0, m_data.GetByteOrder(), m_data.GetAddressByteSize());
12734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
12744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const addr_t nlist_data_byte_size = symtab_load_command.nsyms * nlist_byte_size;
12754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const addr_t strtab_data_byte_size = symtab_load_command.strsize;
1276dd29b97f71187509df339596c3397dea0e429754Greg Clayton        addr_t strtab_addr = LLDB_INVALID_ADDRESS;
1277dd29b97f71187509df339596c3397dea0e429754Greg Clayton        if (process)
12784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
1279dd29b97f71187509df339596c3397dea0e429754Greg Clayton            Target &target = process->GetTarget();
12804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            SectionSP linkedit_section_sp(section_list->FindSectionByName(GetSegmentNameLINKEDIT()));
12814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            // Reading mach file from memory in a process or core file...
12820fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
12834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (linkedit_section_sp)
12844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
12854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                const addr_t linkedit_load_addr = linkedit_section_sp->GetLoadBaseAddress(&target);
12864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                const addr_t linkedit_file_offset = linkedit_section_sp->GetFileOffset();
12874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                const addr_t symoff_addr = linkedit_load_addr + symtab_load_command.symoff - linkedit_file_offset;
1288dd29b97f71187509df339596c3397dea0e429754Greg Clayton                strtab_addr = linkedit_load_addr + symtab_load_command.stroff - linkedit_file_offset;
128929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton
129029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                bool data_was_read = false;
129129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton
129229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#if defined (__APPLE__) && defined (__arm__)
129329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                if (m_header.flags & 0x80000000u)
12940fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton                {
129529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // This mach-o memory file is in the dyld shared cache. If this
129629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // program is not remote and this is iOS, then this process will
129729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // share the same shared cache as the process we are debugging and
129829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // we can read the entire __LINKEDIT from the address space in this
129929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // process. This is a needed optimization that is used for local iOS
130029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // debugging only since all shared libraries in the shared cache do
130129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // not have corresponding files that exist in the file system of the
130229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // device. They have been combined into a single file. This means we
130329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // always have to load these files from memory. All of the symbol and
130429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // string tables from all of the __LINKEDIT sections from the shared
130529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // libraries in the shared cache have been merged into a single large
130629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // symbol and string table. Reading all of this symbol and string table
130729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // data across can slow down debug launch times, so we optimize this by
130829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // reading the memory for the __LINKEDIT section from this process.
130929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    PlatformSP platform_sp (target.GetPlatform());
131029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    if (platform_sp && platform_sp->IsHost())
131129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    {
131229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        data_was_read = true;
131329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        nlist_data.SetData((void *)symoff_addr, nlist_data_byte_size, eByteOrderLittle);
1314dd29b97f71187509df339596c3397dea0e429754Greg Clayton                        strtab_data.SetData((void *)strtab_addr, strtab_data_byte_size, eByteOrderLittle);
131529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        if (function_starts_load_command.cmd)
131629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        {
131729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                            const addr_t func_start_addr = linkedit_load_addr + function_starts_load_command.dataoff - linkedit_file_offset;
131829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                            function_starts_data.SetData ((void *)func_start_addr, function_starts_load_command.datasize, eByteOrderLittle);
131929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        }
132029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    }
132129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                }
132229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#endif
132329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton
132429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                if (!data_was_read)
132529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                {
132629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    DataBufferSP nlist_data_sp (ReadMemory (process_sp, symoff_addr, nlist_data_byte_size));
132729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    if (nlist_data_sp)
132829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        nlist_data.SetData (nlist_data_sp, 0, nlist_data_sp->GetByteSize());
1329dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    //DataBufferSP strtab_data_sp (ReadMemory (process_sp, strtab_addr, strtab_data_byte_size));
1330dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    //if (strtab_data_sp)
1331dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    //    strtab_data.SetData (strtab_data_sp, 0, strtab_data_sp->GetByteSize());
133229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    if (function_starts_load_command.cmd)
133329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    {
133429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        const addr_t func_start_addr = linkedit_load_addr + function_starts_load_command.dataoff - linkedit_file_offset;
133529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        DataBufferSP func_start_data_sp (ReadMemory (process_sp, func_start_addr, function_starts_load_command.datasize));
133629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        if (func_start_data_sp)
133729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                            function_starts_data.SetData (func_start_data_sp, 0, func_start_data_sp->GetByteSize());
133829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    }
13390fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton                }
13404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
13414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
13424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        else
13434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
13444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist_data.SetData (m_data,
13454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                symtab_load_command.symoff,
13464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                nlist_data_byte_size);
13474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            strtab_data.SetData (m_data,
13484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                 symtab_load_command.stroff,
13494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                 strtab_data_byte_size);
13504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (function_starts_load_command.cmd)
13514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
13524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                function_starts_data.SetData (m_data,
13534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                              function_starts_load_command.dataoff,
13544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                              function_starts_load_command.datasize);
13554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
13564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (nlist_data.GetByteSize() == 0)
13594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
13604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (log)
13614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                module_sp->LogMessage(log.get(), "failed to read nlist data");
13624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            return 0;
13634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1365a9c4f31f3c511a731fecdf09e8f032f4f537ebfaGreg Clayton
13663a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton        const bool have_strtab_data = strtab_data.GetByteSize() > 0;
13673a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton        if (!have_strtab_data)
1368dd29b97f71187509df339596c3397dea0e429754Greg Clayton        {
13693a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            if (process)
13703a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            {
13713a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                if (strtab_addr == LLDB_INVALID_ADDRESS)
13723a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                {
13733a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    if (log)
13743a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                        module_sp->LogMessage(log.get(), "failed to locate the strtab in memory");
13753a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    return 0;
13763a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                }
13773a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            }
13783a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            else
1379dd29b97f71187509df339596c3397dea0e429754Greg Clayton            {
1380dd29b97f71187509df339596c3397dea0e429754Greg Clayton                if (log)
13813a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    module_sp->LogMessage(log.get(), "failed to read strtab data");
1382dd29b97f71187509df339596c3397dea0e429754Greg Clayton                return 0;
1383dd29b97f71187509df339596c3397dea0e429754Greg Clayton            }
1384dd29b97f71187509df339596c3397dea0e429754Greg Clayton        }
1385dd29b97f71187509df339596c3397dea0e429754Greg Clayton
13864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_segment_name_TEXT = GetSegmentNameTEXT();
13874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_segment_name_DATA = GetSegmentNameDATA();
13884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_segment_name_OBJC = GetSegmentNameOBJC();
13894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_section_name_eh_frame = GetSectionNameEHFrame();
13904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP text_section_sp(section_list->FindSectionByName(g_segment_name_TEXT));
13914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP data_section_sp(section_list->FindSectionByName(g_segment_name_DATA));
13924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP objc_section_sp(section_list->FindSectionByName(g_segment_name_OBJC));
13934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP eh_frame_section_sp;
13944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (text_section_sp.get())
13954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            eh_frame_section_sp = text_section_sp->GetChildren().FindSectionByName (g_section_name_eh_frame);
13964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        else
13974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            eh_frame_section_sp = section_list->FindSectionByName (g_section_name_eh_frame);
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1399d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton        const bool is_arm = (m_header.cputype == llvm::MachO::CPUTypeARM);
14004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (text_section_sp && function_starts_data.GetByteSize())
14014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
14024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            FunctionStarts::Entry function_start_entry;
14034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_start_entry.data = false;
14044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            uint32_t function_start_offset = 0;
14054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_start_entry.addr = text_section_sp->GetFileAddress();
14064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            uint64_t delta;
14074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            while ((delta = function_starts_data.GetULEB128(&function_start_offset)) > 0)
14084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
14094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // Now append the current entry
14104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                function_start_entry.addr += delta;
14114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                function_starts.Append(function_start_entry);
14124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
14134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
14144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const uint32_t function_starts_count = function_starts.GetSize();
14164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint8_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NListSectionNoSection;
14184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t nlist_data_offset = 0;
14204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t N_SO_index = UINT32_MAX;
14224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        MachSymtabSectionInfo section_info (section_list);
14244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_FUN_indexes;
14254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_NSYM_indexes;
14264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_INCL_indexes;
14274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_BRAC_indexes;
14284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_COMM_indexes;
14294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        typedef std::map <uint64_t, uint32_t> ValueToSymbolIndexMap;
14304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        typedef std::map <uint32_t, uint32_t> NListIndexToSymbolIndexMap;
14314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        ValueToSymbolIndexMap N_FUN_addr_to_sym_idx;
14324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        ValueToSymbolIndexMap N_STSYM_addr_to_sym_idx;
14334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // Any symbols that get merged into another will get an entry
14344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // in this map so we know
14354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        NListIndexToSymbolIndexMap m_nlist_idx_to_sym_idx;
14364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t nlist_idx = 0;
14374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        Symbol *symbol_ptr = NULL;
14384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t sym_idx = 0;
1440b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        Symbol *sym = NULL;
1441b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t num_syms = 0;
1442dd29b97f71187509df339596c3397dea0e429754Greg Clayton        std::string memory_symbol_name;
1443b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t unmapped_local_symbols_found = 0;
1444b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1445b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda#if defined (__APPLE__) && defined (__arm__)
1446b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1447b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // Some recent builds of the dyld_shared_cache (hereafter: DSC) have been optimized by moving LOCAL
1448b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // symbols out of the memory mapped portion of the DSC. The symbol information has all been retained,
1449b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // but it isn't available in the normal nlist data. However, there *are* duplicate entries of *some*
1450b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // LOCAL symbols in the normal nlist data. To handle this situation correctly, we must first attempt
1451b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // to parse any DSC unmapped symbol information. If we find any, we set a flag that tells the normal
1452b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // nlist parser to ignore all LOCAL symbols.
14534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
1454b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        if (m_header.flags & 0x80000000u)
1455b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
1456b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Before we can start mapping the DSC, we need to make certain the target process is actually
1457b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // using the cache we can find.
1458b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1459b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            /*
1460b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             * TODO (FIXME!)
1461b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             *
1462b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             * Consider the case of testing with a separate DSC file.
1463b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             * If we go through the normal code paths, we will give symbols for the wrong DSC, and
1464b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             * that is bad.  We need to read the target process' all_image_infos struct, and look
1465b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             * at the values of the processDetachedFromSharedRegion field. If that is set, we should skip
1466b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             * this code section.
1467b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda             */
1468b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1469b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Next we need to determine the correct path for the dyld shared cache.
1470b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1471b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
1472b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            char dsc_path[PATH_MAX];
1473b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1474b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            snprintf(dsc_path, sizeof(dsc_path), "%s%s%s",
1475b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                     "/System/Library/Caches/com.apple.dyld/",	/* IPHONE_DYLD_SHARED_CACHE_DIR */
1476b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                     "dyld_shared_cache_",			/* DYLD_SHARED_CACHE_BASE_NAME */
1477b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                     header_arch.GetArchitectureName());
1478b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1479b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            FileSpec dsc_filespec(dsc_path, false);
1480b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1481b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // We need definitions of two structures in the on-disk DSC, copy them here manually
1482b62abd5162c166f81e5c9b473f754d957657b891Jason Molendastruct lldb_copy_dyld_cache_header
1483b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda{
1484b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	char		magic[16];
1485b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint32_t	mappingOffset;
1486b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint32_t	mappingCount;
1487b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint32_t	imagesOffset;
1488b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint32_t	imagesCount;
1489b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	dyldBaseAddress;
1490b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	codeSignatureOffset;
1491b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	codeSignatureSize;
1492b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	slideInfoOffset;
1493b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	slideInfoSize;
1494b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	localSymbolsOffset;
1495b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda	uint64_t	localSymbolsSize;
1496b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda};
1497b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1498b62abd5162c166f81e5c9b473f754d957657b891Jason Molendastruct lldb_copy_dyld_cache_local_symbols_info
1499b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda{
1500b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        nlistOffset;
1501b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        nlistCount;
1502b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        stringsOffset;
1503b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        stringsSize;
1504b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        entriesOffset;
1505b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        entriesCount;
1506b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda};
1507b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1508b62abd5162c166f81e5c9b473f754d957657b891Jason Molendastruct lldb_copy_dyld_cache_local_symbols_entry
1509b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda{
1510b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        dylibOffset;
1511b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        nlistStartIndex;
1512b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t        nlistCount;
1513b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda};
1514b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1515b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Process the dsc header to find the unmapped symbols
1516b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            //
1517b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Save some VM space, do not map the entire cache in one shot.
1518b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1519b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            if (DataBufferSP dsc_data_sp = dsc_filespec.MemoryMapFileContents(0, sizeof(struct lldb_copy_dyld_cache_header)))
1520b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            {
1521b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                DataExtractor dsc_header_data(dsc_data_sp, m_data.GetByteOrder(), m_data.GetAddressByteSize());
1522b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1523b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                struct lldb_copy_dyld_cache_header* dsc_header_dummy = NULL;
1524b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1525b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                uint32_t offset = sizeof(dsc_header_dummy->magic);
1526b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                uint32_t mappingOffset = dsc_header_data.GetU32(&offset);
1527b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1528b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                // If the mappingOffset points to a location inside the header, we've
1529b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                // opened an old dyld shared cache, and should not proceed further.
1530b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                if (mappingOffset >= sizeof(struct lldb_copy_dyld_cache_header))
1531b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                {
1532b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1533b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    offset = (uint32_t)(uintptr_t)&dsc_header_dummy->localSymbolsOffset;
1534b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    uint64_t localSymbolsOffset = dsc_header_data.GetU64(&offset);
1535b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    uint64_t localSymbolsSize = dsc_header_data.GetU64(&offset);
1536b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1537b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    if (localSymbolsOffset && localSymbolsSize)
1538b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    {
1539b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        // Map the local symbols
1540b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        if (DataBufferSP dsc_local_symbols_data_sp = dsc_filespec.MemoryMapFileContents(localSymbolsOffset, localSymbolsSize))
1541b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        {
1542b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            DataExtractor dsc_local_symbols_data(dsc_local_symbols_data_sp, m_data.GetByteOrder(), m_data.GetAddressByteSize());
1543b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1544b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            offset = 0;
1545b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1546b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            // Read the local_symbols_infos struct in one shot
1547b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            struct lldb_copy_dyld_cache_local_symbols_info local_symbols_info;
1548b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            dsc_local_symbols_data.GetU32(&offset, &local_symbols_info.nlistOffset, 6);
1549b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1550b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            // The local_symbols_infos offsets are offsets into local symbols memory, NOT file offsets!
1551b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            // We first need to identify the local "entry" that matches the current header.
1552b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            // The "entry" is stored as a file offset in the dyld_shared_cache, so we need to
1553b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            // adjust the raw m_header value by slide and 0x30000000.
1554b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1555b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            SectionSP text_section_sp(section_list->FindSectionByName(GetSegmentNameTEXT()));
1556b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1557b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            uint32_t header_file_offset = (text_section_sp->GetFileAddress() - 0x30000000);
1558b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1559b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            offset = local_symbols_info.entriesOffset;
1560b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            for (uint32_t entry_index = 0; entry_index < local_symbols_info.entriesCount; entry_index++)
1561b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            {
1562b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                struct lldb_copy_dyld_cache_local_symbols_entry local_symbols_entry;
1563b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                local_symbols_entry.dylibOffset = dsc_local_symbols_data.GetU32(&offset);
1564b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                local_symbols_entry.nlistStartIndex = dsc_local_symbols_data.GetU32(&offset);
1565b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                local_symbols_entry.nlistCount = dsc_local_symbols_data.GetU32(&offset);
1566b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1567b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                if (header_file_offset == local_symbols_entry.dylibOffset)
1568b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                {
1569b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    unmapped_local_symbols_found = local_symbols_entry.nlistCount;
1570b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1571b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    // The normal nlist code cannot correctly size the Symbols array, we need to allocate it here.
1572b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    sym = symtab->Resize (symtab_load_command.nsyms + m_dysymtab.nindirectsyms + unmapped_local_symbols_found - m_dysymtab.nlocalsym);
1573b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    num_syms = symtab->GetNumSymbols();
1574b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1575b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    nlist_data_offset = local_symbols_info.nlistOffset + (nlist_byte_size * local_symbols_entry.nlistStartIndex);
1576b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    uint32_t string_table_offset = local_symbols_info.stringsOffset;
1577b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1578b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    for (uint32_t nlist_index = 0; nlist_index < local_symbols_entry.nlistCount; nlist_index++)
1579b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    {
1580b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        /////////////////////////////
1581b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        {
1582b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            struct nlist_64 nlist;
1583b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (!dsc_local_symbols_data.ValidOffsetForDataOfSize(nlist_data_offset, nlist_byte_size))
1584b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                break;
1585b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1586b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_strx  = dsc_local_symbols_data.GetU32_unchecked(&nlist_data_offset);
1587b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_type  = dsc_local_symbols_data.GetU8_unchecked (&nlist_data_offset);
1588b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_sect  = dsc_local_symbols_data.GetU8_unchecked (&nlist_data_offset);
1589b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_desc  = dsc_local_symbols_data.GetU16_unchecked (&nlist_data_offset);
1590b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_value = dsc_local_symbols_data.GetAddress_unchecked (&nlist_data_offset);
1591b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1592b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            SymbolType type = eSymbolTypeInvalid;
1593b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            const char *symbol_name = dsc_local_symbols_data.PeekCStr(string_table_offset + nlist.n_strx);
1594b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1595b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (symbol_name == NULL)
1596b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
1597b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                // No symbol should be NULL, even the symbols with no
1598b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                // string values should have an offset zero which points
1599b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                // to an empty C-string
1600b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                Host::SystemLog (Host::eSystemLogError,
1601b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 "error: DSC unmapped local symbol[%u] has invalid string table offset 0x%x in %s/%s, ignoring symbol\n",
1602b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 entry_index,
1603b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 nlist.n_strx,
1604b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 module_sp->GetFileSpec().GetDirectory().GetCString(),
1605b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 module_sp->GetFileSpec().GetFilename().GetCString());
1606b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                continue;
1607b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
1608b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (symbol_name[0] == '\0')
1609b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                symbol_name = NULL;
1610b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1611b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            const char *symbol_name_non_abi_mangled = NULL;
1612b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1613b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            SectionSP symbol_section;
1614b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            uint32_t symbol_byte_size = 0;
1615b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            bool add_nlist = true;
1616b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            bool is_debug = ((nlist.n_type & NlistMaskStab) != 0);
1617b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1618b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            assert (sym_idx < num_syms);
1619b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1620b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            sym[sym_idx].SetDebug (is_debug);
1621b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1622b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (is_debug)
1623b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
1624b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                switch (nlist.n_type)
1625b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
1626b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabGlobalSymbol:
1627b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_GSYM -- global symbol: name,,NO_SECT,type,0
1628b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Sometimes the N_GSYM value contains the address.
1629b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1630b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // FIXME: In the .o files, we have a GSYM and a debug symbol for all the ObjC data.  They
1631b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // have the same address, but we want to ensure that we always find only the real symbol,
1632b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // 'cause we don't currently correctly attribute the GSYM one to the ObjCClass/Ivar/MetaClass
1633b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // symbol type.  This is a temporary hack to make sure the ObjectiveC symbols get treated
1634b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // correctly.  To do this right, we should coalesce all the GSYM & global symbols that have the
1635b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // same address.
1636b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1637b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_name && symbol_name[0] == '_' && symbol_name[1] ==  'O'
1638b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            && (strncmp (symbol_name, "_OBJC_IVAR_$_", strlen ("_OBJC_IVAR_$_")) == 0
1639b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                || strncmp (symbol_name, "_OBJC_CLASS_$_", strlen ("_OBJC_CLASS_$_")) == 0
1640b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                || strncmp (symbol_name, "_OBJC_METACLASS_$_", strlen ("_OBJC_METACLASS_$_")) == 0))
1641b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            add_nlist = false;
1642b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
1643b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1644b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            sym[sym_idx].SetExternal(true);
1645b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (nlist.n_value != 0)
1646b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1647b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeData;
1648b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1649b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1650b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1651b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabFunctionName:
1652b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0
1653b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
1654b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1655b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1656b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabFunction:
1657b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_FUN -- procedure: name,,n_sect,linenumber,address
1658b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_name)
1659b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1660b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeCode;
1661b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1662b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1663b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_FUN_addr_to_sym_idx[nlist.n_value] = sym_idx;
1664b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // We use the current number of symbols in the symbol table in lieu of
1665b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // using nlist_idx in case we ever start trimming entries out
1666b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_FUN_indexes.push_back(sym_idx);
1667b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1668b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
1669b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1670b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeCompiler;
1671b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1672b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if ( !N_FUN_indexes.empty() )
1673b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
1674b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Copy the size of the function into the original STAB entry so we don't have
1675b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // to hunt for it later
1676b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symtab->SymbolAtIndex(N_FUN_indexes.back())->SetByteSize(nlist.n_value);
1677b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                N_FUN_indexes.pop_back();
1678b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // We don't really need the end function STAB as it contains the size which
1679b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // we already placed with the original symbol, so don't add it if we want a
1680b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // minimal symbol table
1681b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (minimize)
1682b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    add_nlist = false;
1683b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
1684b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1685b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1686b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1687b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabStaticSymbol:
1688b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_STSYM -- static symbol: name,,n_sect,type,address
1689b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_STSYM_addr_to_sym_idx[nlist.n_value] = sym_idx;
1690b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1691b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeData;
1692b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1693b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1694b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLocalCommon:
1695b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address
1696b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1697b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCommonBlock;
1698b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1699b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1700b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabBeginSymbol:
1701b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_BNSYM
1702b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
1703b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
1704b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (minimize)
1705b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1706b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // Skip these if we want minimal symbol tables
1707b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            add_nlist = false;
1708b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1709b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
1710b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1711b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1712b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_NSYM_indexes.push_back(sym_idx);
1713b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeScopeBegin;
1714b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1715b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1716b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1717b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndSymbol:
1718b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ENSYM
1719b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_BNSYM to the terminating index of this N_ENSYM
1720b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
1721b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
1722b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (minimize)
1723b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1724b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // Skip these if we want minimal symbol tables
1725b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            add_nlist = false;
1726b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1727b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
1728b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1729b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if ( !N_NSYM_indexes.empty() )
1730b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
1731b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr = symtab->SymbolAtIndex(N_NSYM_indexes.back());
1732b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr->SetByteSize(sym_idx + 1);
1733b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr->SetSizeIsSibling(true);
1734b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                N_NSYM_indexes.pop_back();
1735b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
1736b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeScopeEnd;
1737b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1738b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1739b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1740b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1741b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabSourceFileOptions:
1742b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_OPT - emitted with gcc2_compiled and in gcc source
1743b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
1744b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1745b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1746b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabRegisterSymbol:
1747b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_RSYM - register sym: name,,NO_SECT,type,register
1748b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeVariable;
1749b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1750b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1751b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabSourceLine:
1752b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SLINE - src line: 0,,n_sect,linenumber,address
1753b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1754b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeLineEntry;
1755b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1756b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1757b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabStructureType:
1758b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset
1759b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeVariableType;
1760b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1761b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1762b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabSourceFileName:
1763b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SO - source file name
1764b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeSourceFile;
1765b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_name == NULL)
1766b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1767b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (minimize)
1768b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                add_nlist = false;
1769b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (N_SO_index != UINT32_MAX)
1770b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
1771b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Set the size of the N_SO to the terminating index of this N_SO
1772b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // so that we can always skip the entire N_SO if we need to navigate
1773b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // more quickly at the source level when parsing STABS
1774b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr = symtab->SymbolAtIndex(N_SO_index);
1775b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr->SetByteSize(sym_idx + (minimize ? 0 : 1));
1776b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr->SetSizeIsSibling(true);
1777b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
1778b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_NSYM_indexes.clear();
1779b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_INCL_indexes.clear();
1780b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_BRAC_indexes.clear();
1781b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_COMM_indexes.clear();
1782b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_FUN_indexes.clear();
1783b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_SO_index = UINT32_MAX;
1784b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1785b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
1786b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1787b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // We use the current number of symbols in the symbol table in lieu of
1788b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // using nlist_idx in case we ever start trimming entries out
1789b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            const bool N_SO_has_full_path = symbol_name[0] == '/';
1790b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (N_SO_has_full_path)
1791b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
1792b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (minimize && (N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
1793b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
1794b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // We have two consecutive N_SO entries where the first contains a directory
1795b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // and the second contains a full path.
1796b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    sym[sym_idx - 1].GetMangled().SetValue(symbol_name, false);
1797b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
1798b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    add_nlist = false;
1799b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
1800b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                else
1801b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
1802b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // This is the first entry in a N_SO that contains a directory or
1803b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // a full path to the source file
1804b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    N_SO_index = sym_idx;
1805b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
1806b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
1807b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            else if (minimize && (N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
1808b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
1809b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // This is usually the second N_SO entry that contains just the filename,
1810b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // so here we combine it with the first one if we are minimizing the symbol table
1811b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                const char *so_path = sym[sym_idx - 1].GetMangled().GetDemangledName().AsCString();
1812b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (so_path && so_path[0])
1813b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
1814b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    std::string full_so_path (so_path);
1815b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    if (*full_so_path.rbegin() != '/')
1816b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        full_so_path += '/';
1817b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    full_so_path += symbol_name;
1818b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    sym[sym_idx - 1].GetMangled().SetValue(full_so_path.c_str(), false);
1819b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    add_nlist = false;
1820b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
1821b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
1822b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
1823b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1824b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1825b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1826b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1827b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabObjectFileName:
1828b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_OSO - object file name: name,,0,0,st_mtime
1829b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeObjectFile;
1830b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1831b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1832b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLocalSymbol:
1833b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LSYM - local sym: name,,NO_SECT,type,offset
1834b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeLocal;
1835b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1836b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1837b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
1838b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // INCL scopes
1839b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
1840b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabBeginIncludeFileName:
1841b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_BINCL - include file beginning: name,,NO_SECT,0,sum
1842b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
1843b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
1844b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_INCL_indexes.push_back(sym_idx);
1845b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeBegin;
1846b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1847b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1848b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndIncludeFile:
1849b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_EINCL - include file end: name,,NO_SECT,0,0
1850b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_BINCL to the terminating index of this N_EINCL
1851b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
1852b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
1853b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if ( !N_INCL_indexes.empty() )
1854b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1855b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr = symtab->SymbolAtIndex(N_INCL_indexes.back());
1856b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetByteSize(sym_idx + 1);
1857b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetSizeIsSibling(true);
1858b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_INCL_indexes.pop_back();
1859b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1860b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeEnd;
1861b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1862b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1863b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabIncludeFileName:
1864b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SOL - #included file name: name,,n_sect,0,address
1865b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeHeaderFile;
1866b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1867b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We currently don't use the header files on darwin
1868b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (minimize)
1869b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            add_nlist = false;
1870b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1871b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1872b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabCompilerParameters:
1873b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_PARAMS - compiler parameters: name,,NO_SECT,0,0
1874b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
1875b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1876b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1877b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabCompilerVersion:
1878b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_VERSION - compiler version: name,,NO_SECT,0,0
1879b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
1880b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1881b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1882b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabCompilerOptLevel:
1883b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0
1884b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
1885b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1886b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1887b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabParameter:
1888b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_PSYM - parameter: name,,NO_SECT,type,offset
1889b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeVariable;
1890b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1891b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1892b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabAlternateEntry:
1893b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ENTRY - alternate entry: name,,n_sect,linenumber,address
1894b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1895b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeLineEntry;
1896b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1897b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1898b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
1899b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Left and Right Braces
1900b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
1901b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLeftBracket:
1902b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address
1903b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
1904b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
1905b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1906b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_BRAC_indexes.push_back(sym_idx);
1907b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeBegin;
1908b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1909b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1910b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabRightBracket:
1911b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address
1912b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_LBRAC to the terminating index of this N_RBRAC
1913b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
1914b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
1915b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1916b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if ( !N_BRAC_indexes.empty() )
1917b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1918b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr = symtab->SymbolAtIndex(N_BRAC_indexes.back());
1919b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetByteSize(sym_idx + 1);
1920b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetSizeIsSibling(true);
1921b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_BRAC_indexes.pop_back();
1922b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1923b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeEnd;
1924b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1925b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1926b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabDeletedIncludeFile:
1927b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_EXCL - deleted include file: name,,NO_SECT,0,sum
1928b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeHeaderFile;
1929b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1930b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1931b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
1932b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // COMM scopes
1933b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
1934b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabBeginCommon:
1935b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_BCOMM - begin common: name,,NO_SECT,0,0
1936b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
1937b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
1938b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeBegin;
1939b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_COMM_indexes.push_back(sym_idx);
1940b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1941b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1942b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndCommonLocal:
1943b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ECOML - end common (local name): 0,,n_sect,0,address
1944b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1945b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Fall through
1946b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1947b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndCommon:
1948b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ECOMM - end common: name,,n_sect,0,0
1949b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML
1950b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
1951b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
1952b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if ( !N_COMM_indexes.empty() )
1953b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1954b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr = symtab->SymbolAtIndex(N_COMM_indexes.back());
1955b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetByteSize(sym_idx + 1);
1956b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetSizeIsSibling(true);
1957b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_COMM_indexes.pop_back();
1958b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1959b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeEnd;
1960b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1961b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1962b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLength:
1963b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LENG - second stab entry with length information
1964b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeAdditional;
1965b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1966b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1967b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    default: break;
1968b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
1969b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
1970b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            else
1971b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
1972b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                //uint8_t n_pext    = NlistMaskPrivateExternal & nlist.n_type;
1973b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                uint8_t n_type  = NlistMaskType & nlist.n_type;
1974b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0);
1975b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1976b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                switch (n_type)
1977b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
1978b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeIndirect:         // N_INDR - Fall through
1979b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypePreboundUndefined:// N_PBUD - Fall through
1980b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeUndefined:        // N_UNDF
1981b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeUndefined;
1982b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1983b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1984b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeAbsolute:         // N_ABS
1985b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeAbsolute;
1986b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
1987b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1988b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeSection:          // N_SECT
1989b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
1990b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
1991b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1992b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_section == NULL)
1993b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
1994b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // TODO: warn about this?
1995b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            add_nlist = false;
1996b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            break;
1997b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
1998b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1999b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (TEXT_eh_frame_sectID == nlist.n_sect)
2000b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2001b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeException;
2002b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2003b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
2004b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2005b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            uint32_t section_type = symbol_section->Get() & SectionFlagMaskSectionType;
2006b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2007b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            switch (section_type)
2008b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2009b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeRegular:                     break; // regular section
2010b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                                                    //case SectionTypeZeroFill:                 type = eSymbolTypeData;    break; // zero fill on demand section
2011b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeCStringLiterals:            type = eSymbolTypeData;    break; // section with only literal C strings
2012b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionType4ByteLiterals:              type = eSymbolTypeData;    break; // section with only 4 byte literals
2013b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionType8ByteLiterals:              type = eSymbolTypeData;    break; // section with only 8 byte literals
2014b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeLiteralPointers:            type = eSymbolTypeTrampoline; break; // section with only pointers to literals
2015b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeNonLazySymbolPointers:      type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers
2016b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeLazySymbolPointers:         type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers
2017b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeSymbolStubs:                type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field
2018b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for initialization
2019b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for termination
2020b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                                                                              //case SectionTypeCoalesced:                type = eSymbolType;    break; // section contains symbols that are to be coalesced
2021b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                                                                              //case SectionTypeZeroFillLarge:            type = eSymbolTypeData;    break; // zero fill on demand section (that can be larger than 4 gigabytes)
2022b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeInterposing:                type = eSymbolTypeTrampoline;  break; // section with only pairs of function pointers for interposing
2023b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionType16ByteLiterals:             type = eSymbolTypeData;    break; // section with only 16 byte literals
2024b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeDTraceObjectFormat:         type = eSymbolTypeInstrumentation; break;
2025b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                case SectionTypeLazyDylibSymbolPointers:    type = eSymbolTypeTrampoline; break;
2026b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                default: break;
2027b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2028b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2029b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (type == eSymbolTypeInvalid)
2030b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2031b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                const char *symbol_sect_name = symbol_section->GetName().AsCString();
2032b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (symbol_section->IsDescendant (text_section_sp.get()))
2033b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
2034b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    if (symbol_section->IsClear(SectionAttrUserPureInstructions |
2035b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                                SectionAttrUserSelfModifyingCode |
2036b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                                SectionAttrSytemSomeInstructions))
2037b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        type = eSymbolTypeData;
2038b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    else
2039b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        type = eSymbolTypeCode;
2040b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
2041b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                else
2042b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    if (symbol_section->IsDescendant(data_section_sp.get()))
2043b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    {
2044b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        if (symbol_sect_name && ::strstr (symbol_sect_name, "__objc") == symbol_sect_name)
2045b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        {
2046b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            type = eSymbolTypeRuntime;
2047b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2048b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            if (symbol_name &&
2049b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                symbol_name[0] == '_' &&
2050b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                symbol_name[1] == 'O' &&
2051b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                symbol_name[2] == 'B')
2052b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            {
2053b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                llvm::StringRef symbol_name_ref(symbol_name);
2054b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                static const llvm::StringRef g_objc_v2_prefix_class ("_OBJC_CLASS_$_");
2055b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                static const llvm::StringRef g_objc_v2_prefix_metaclass ("_OBJC_METACLASS_$_");
2056b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                static const llvm::StringRef g_objc_v2_prefix_ivar ("_OBJC_IVAR_$_");
2057b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                if (symbol_name_ref.startswith(g_objc_v2_prefix_class))
2058b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2059b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name_non_abi_mangled = symbol_name + 1;
2060b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2061b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    type = eSymbolTypeObjCClass;
2062b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2063b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                else if (symbol_name_ref.startswith(g_objc_v2_prefix_metaclass))
2064b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2065b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name_non_abi_mangled = symbol_name + 1;
2066b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2067b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    type = eSymbolTypeObjCMetaClass;
2068b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2069b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                else if (symbol_name_ref.startswith(g_objc_v2_prefix_ivar))
2070b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2071b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name_non_abi_mangled = symbol_name + 1;
2072b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2073b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    type = eSymbolTypeObjCIVar;
2074b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2075b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            }
2076b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        }
2077b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        else
2078b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            if (symbol_sect_name && ::strstr (symbol_sect_name, "__gcc_except_tab") == symbol_sect_name)
2079b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            {
2080b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                type = eSymbolTypeException;
2081b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            }
2082b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            else
2083b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            {
2084b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                type = eSymbolTypeData;
2085b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            }
2086b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    }
2087b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    else
2088b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        if (symbol_sect_name && ::strstr (symbol_sect_name, "__IMPORT") == symbol_sect_name)
2089b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        {
2090b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            type = eSymbolTypeTrampoline;
2091b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        }
2092b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        else
2093b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            if (symbol_section->IsDescendant(objc_section_sp.get()))
2094b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            {
2095b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                type = eSymbolTypeRuntime;
2096b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                if (symbol_name && symbol_name[0] == '.')
2097b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2098b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    llvm::StringRef symbol_name_ref(symbol_name);
2099b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    static const llvm::StringRef g_objc_v1_prefix_class (".objc_class_name_");
2100b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    if (symbol_name_ref.startswith(g_objc_v1_prefix_class))
2101b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    {
2102b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                        symbol_name_non_abi_mangled = symbol_name;
2103b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                        symbol_name = symbol_name + g_objc_v1_prefix_class.size();
2104b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                        type = eSymbolTypeObjCClass;
2105b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    }
2106b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2107b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            }
2108b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2109b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2110b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2111b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2112b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2113b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2114b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2115b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (add_nlist)
2116b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2117b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                uint64_t symbol_value = nlist.n_value;
2118b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                bool symbol_name_is_mangled = false;
2119b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2120b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (symbol_name_non_abi_mangled)
2121b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2122b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    sym[sym_idx].GetMangled().SetMangledName (symbol_name_non_abi_mangled);
2123b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    sym[sym_idx].GetMangled().SetDemangledName (symbol_name);
2124b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2125b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                else
2126b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2127b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (symbol_name && symbol_name[0] == '_')
2128b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2129b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_name_is_mangled = symbol_name[1] == '_';
2130b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_name++;  // Skip the leading underscore
2131b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2132b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2133b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (symbol_name)
2134b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2135b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        sym[sym_idx].GetMangled().SetValue(symbol_name, symbol_name_is_mangled);
2136b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2137b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2138b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2139b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (is_debug == false)
2140b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2141b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (type == eSymbolTypeCode)
2142b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2143b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // See if we can find a N_FUN entry for any code symbols.
2144b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // If we do find a match, and the name matches, then we
2145b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // can merge the two into just the function symbol to avoid
2146b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // duplicate entries in the symbol table
2147b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        ValueToSymbolIndexMap::const_iterator pos = N_FUN_addr_to_sym_idx.find (nlist.n_value);
2148b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (pos != N_FUN_addr_to_sym_idx.end())
2149b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2150b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) ||
2151b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName()))
2152b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2153b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
2154b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // We just need the flags from the linker symbol, so put these flags
2155b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // into the N_FUN flags to avoid duplicate symbols in the symbol table
2156b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
2157b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                sym[sym_idx].Clear();
2158b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                continue;
2159b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2160b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2161b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2162b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    else if (type == eSymbolTypeData)
2163b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2164b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // See if we can find a N_STSYM entry for any data symbols.
2165b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // If we do find a match, and the name matches, then we
2166b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // can merge the two into just the Static symbol to avoid
2167b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // duplicate entries in the symbol table
2168b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        ValueToSymbolIndexMap::const_iterator pos = N_STSYM_addr_to_sym_idx.find (nlist.n_value);
2169b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (pos != N_STSYM_addr_to_sym_idx.end())
2170b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2171b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) ||
2172b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName()))
2173b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2174b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
2175b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // We just need the flags from the linker symbol, so put these flags
2176b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // into the N_STSYM flags to avoid duplicate symbols in the symbol table
2177b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
2178b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                sym[sym_idx].Clear();
2179b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                continue;
2180b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2181b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2182b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2183b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2184b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (symbol_section)
2185b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2186b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    const addr_t section_file_addr = symbol_section->GetFileAddress();
2187b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (symbol_byte_size == 0 && function_starts_count > 0)
2188b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2189b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        addr_t symbol_lookup_file_addr = nlist.n_value;
2190b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Do an exact address match for non-ARM addresses, else get the closest since
2191b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // the symbol might be a thumb symbol which has an address with bit zero set
2192b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        FunctionStarts::Entry *func_start_entry = function_starts.FindEntry (symbol_lookup_file_addr, !is_arm);
2193b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (is_arm && func_start_entry)
2194b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2195b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // Verify that the function start address is the symbol address (ARM)
2196b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // or the symbol address + 1 (thumb)
2197b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (func_start_entry->addr != symbol_lookup_file_addr &&
2198b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                func_start_entry->addr != (symbol_lookup_file_addr + 1))
2199b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2200b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Not the right entry, NULL it out...
2201b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                func_start_entry = NULL;
2202b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2203b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2204b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (func_start_entry)
2205b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2206b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            func_start_entry->data = true;
2207b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2208b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            addr_t symbol_file_addr = func_start_entry->addr;
2209b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            uint32_t symbol_flags = 0;
2210b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (is_arm)
2211b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2212b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (symbol_file_addr & 1)
2213b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    symbol_flags = MACHO_NLIST_ARM_SYMBOL_IS_THUMB;
2214b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_file_addr &= 0xfffffffffffffffeull;
2215b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2216b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2217b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            const FunctionStarts::Entry *next_func_start_entry = function_starts.FindNextEntry (func_start_entry);
2218b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            const addr_t section_end_file_addr = section_file_addr + symbol_section->GetByteSize();
2219b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (next_func_start_entry)
2220b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2221b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                addr_t next_symbol_file_addr = next_func_start_entry->addr;
2222b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Be sure the clear the Thumb address bit when we calculate the size
2223b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // from the current and next address
2224b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (is_arm)
2225b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    next_symbol_file_addr &= 0xfffffffffffffffeull;
2226b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_byte_size = std::min<lldb::addr_t>(next_symbol_file_addr - symbol_file_addr, section_end_file_addr - symbol_file_addr);
2227b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2228b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            else
2229b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2230b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_byte_size = section_end_file_addr - symbol_file_addr;
2231b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2232b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2233b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2234b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    symbol_value -= section_file_addr;
2235b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2236b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2237b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetID (nlist_idx);
2238b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetType (type);
2239b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].GetAddress().SetSection (symbol_section);
2240b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].GetAddress().SetOffset (symbol_value);
2241b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
2242b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2243b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (symbol_byte_size > 0)
2244b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    sym[sym_idx].SetByteSize(symbol_byte_size);
2245b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2246b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                ++sym_idx;
2247b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2248b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            else
2249b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2250b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].Clear();
2251b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2252b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2253b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        }
2254b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        /////////////////////////////
2255b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    }
2256b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    break; // No more entries to consider
2257b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                }
2258b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            }
2259b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        }
2260b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    }
2261b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                }
2262b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            }
2263b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2264b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2265b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // Must reset this in case it was mutated above!
2266b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        nlist_data_offset = 0;
2267b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda#endif
2268b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2269b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // If the sym array was not created while parsing the DSC unmapped
2270b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // symbols, create it now.
2271b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        if (sym == NULL)
2272b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
2273b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            sym = symtab->Resize (symtab_load_command.nsyms + m_dysymtab.nindirectsyms);
2274b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            num_syms = symtab->GetNumSymbols();
2275b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2276b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2277b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        if (unmapped_local_symbols_found)
2278b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
2279b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            assert(m_dysymtab.ilocalsym == 0);
2280b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            nlist_data_offset += (m_dysymtab.nlocalsym * nlist_byte_size);
2281b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            nlist_idx = m_dysymtab.nlocalsym;
2282b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2283b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        else
2284b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
2285b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            nlist_idx = 0;
2286b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2287b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2288b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        for (; nlist_idx < symtab_load_command.nsyms; ++nlist_idx)
22894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
22904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            struct nlist_64 nlist;
22914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (!nlist_data.ValidOffsetForDataOfSize(nlist_data_offset, nlist_byte_size))
22924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                break;
229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_strx  = nlist_data.GetU32_unchecked(&nlist_data_offset);
22954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_type  = nlist_data.GetU8_unchecked (&nlist_data_offset);
22964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_sect  = nlist_data.GetU8_unchecked (&nlist_data_offset);
22974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_desc  = nlist_data.GetU16_unchecked (&nlist_data_offset);
22984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_value = nlist_data.GetAddress_unchecked (&nlist_data_offset);
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            SymbolType type = eSymbolTypeInvalid;
2301dd29b97f71187509df339596c3397dea0e429754Greg Clayton            const char *symbol_name = NULL;
2302dd29b97f71187509df339596c3397dea0e429754Greg Clayton
23033a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            if (have_strtab_data)
2304dd29b97f71187509df339596c3397dea0e429754Greg Clayton            {
2305dd29b97f71187509df339596c3397dea0e429754Greg Clayton                symbol_name = strtab_data.PeekCStr(nlist.n_strx);
2306dd29b97f71187509df339596c3397dea0e429754Greg Clayton
2307dd29b97f71187509df339596c3397dea0e429754Greg Clayton                if (symbol_name == NULL)
2308dd29b97f71187509df339596c3397dea0e429754Greg Clayton                {
2309dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    // No symbol should be NULL, even the symbols with no
2310dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    // string values should have an offset zero which points
2311dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    // to an empty C-string
2312dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    Host::SystemLog (Host::eSystemLogError,
2313dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     "error: symbol[%u] has invalid string table offset 0x%x in %s/%s, ignoring symbol\n",
2314dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     nlist_idx,
2315dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     nlist.n_strx,
2316dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     module_sp->GetFileSpec().GetDirectory().GetCString(),
2317dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     module_sp->GetFileSpec().GetFilename().GetCString());
2318dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    continue;
2319dd29b97f71187509df339596c3397dea0e429754Greg Clayton                }
2320dd29b97f71187509df339596c3397dea0e429754Greg Clayton                if (symbol_name[0] == '\0')
2321dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    symbol_name = NULL;
23224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
23233a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            else
23243a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            {
23253a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                const addr_t str_addr = strtab_addr + nlist.n_strx;
23263a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                Error str_error;
23273a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                if (process->ReadCStringFromMemory(str_addr, memory_symbol_name, str_error))
23283a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    symbol_name = memory_symbol_name.c_str();
23293a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            }
23304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            const char *symbol_name_non_abi_mangled = NULL;
233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            SectionSP symbol_section;
23334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            uint32_t symbol_byte_size = 0;
23344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            bool add_nlist = true;
23354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            bool is_debug = ((nlist.n_type & NlistMaskStab) != 0);
233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            assert (sym_idx < num_syms);
233824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            sym[sym_idx].SetDebug (is_debug);
234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (is_debug)
23424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
23434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                switch (nlist.n_type)
23444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
23454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabGlobalSymbol:
23464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_GSYM -- global symbol: name,,NO_SECT,type,0
23474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Sometimes the N_GSYM value contains the address.
23484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
23494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // FIXME: In the .o files, we have a GSYM and a debug symbol for all the ObjC data.  They
23504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // have the same address, but we want to ensure that we always find only the real symbol,
23514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // 'cause we don't currently correctly attribute the GSYM one to the ObjCClass/Ivar/MetaClass
23524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // symbol type.  This is a temporary hack to make sure the ObjectiveC symbols get treated
23534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // correctly.  To do this right, we should coalesce all the GSYM & global symbols that have the
23544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // same address.
23554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
23564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name && symbol_name[0] == '_' && symbol_name[1] ==  'O'
23574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        && (strncmp (symbol_name, "_OBJC_IVAR_$_", strlen ("_OBJC_IVAR_$_")) == 0
23584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            || strncmp (symbol_name, "_OBJC_CLASS_$_", strlen ("_OBJC_CLASS_$_")) == 0
23594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            || strncmp (symbol_name, "_OBJC_METACLASS_$_", strlen ("_OBJC_METACLASS_$_")) == 0))
23604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        add_nlist = false;
23614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
23624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
23634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        sym[sym_idx].SetExternal(true);
23644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (nlist.n_value != 0)
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
23664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeData;
23674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
23684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabFunctionName:
23714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0
23724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
23734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabFunction:
23764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_FUN -- procedure: name,,n_sect,linenumber,address
23774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name)
23784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
23794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeCode;
23804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
23814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
23824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_FUN_addr_to_sym_idx[nlist.n_value] = sym_idx;
23834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // We use the current number of symbols in the symbol table in lieu of
23844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // using nlist_idx in case we ever start trimming entries out
23854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_FUN_indexes.push_back(sym_idx);
23864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
23874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
23884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
23894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeCompiler;
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if ( !N_FUN_indexes.empty() )
23924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
23934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // Copy the size of the function into the original STAB entry so we don't have
23944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // to hunt for it later
23954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symtab->SymbolAtIndex(N_FUN_indexes.back())->SetByteSize(nlist.n_value);
23964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            N_FUN_indexes.pop_back();
23974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // We don't really need the end function STAB as it contains the size which
23984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // we already placed with the original symbol, so don't add it if we want a
23994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // minimal symbol table
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (minimize)
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                add_nlist = false;
24024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
24034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
24044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
24054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
24064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabStaticSymbol:
24074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_STSYM -- static symbol: name,,n_sect,type,address
24084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_STSYM_addr_to_sym_idx[nlist.n_value] = sym_idx;
24094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
24104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeData;
24114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
24124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
24134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLocalCommon:
24144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address
24154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
24164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCommonBlock;
24174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
24184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
24194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabBeginSymbol:
24204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_BNSYM
24214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
24224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
24234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (minimize)
24244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
24254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // Skip these if we want minimal symbol tables
24264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        add_nlist = false;
24274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
24284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
24294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
24304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
24314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_NSYM_indexes.push_back(sym_idx);
24324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeScopeBegin;
24334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
24344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
24354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
24364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndSymbol:
24374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ENSYM
24384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_BNSYM to the terminating index of this N_ENSYM
24394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
24404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
24414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (minimize)
24424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
24434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // Skip these if we want minimal symbol tables
24444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        add_nlist = false;
24454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
24464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
24474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
24484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if ( !N_NSYM_indexes.empty() )
24494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
24504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr = symtab->SymbolAtIndex(N_NSYM_indexes.back());
24514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr->SetByteSize(sym_idx + 1);
24524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr->SetSizeIsSibling(true);
24534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            N_NSYM_indexes.pop_back();
24544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
24554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeScopeEnd;
24564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
24574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabSourceFileOptions:
24614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_OPT - emitted with gcc2_compiled and in gcc source
24624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
24634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabRegisterSymbol:
24664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_RSYM - register sym: name,,NO_SECT,type,register
24674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeVariable;
24684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabSourceLine:
24714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SLINE - src line: 0,,n_sect,linenumber,address
24724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
24734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeLineEntry;
24744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabStructureType:
24774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset
24784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeVariableType;
24794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabSourceFileName:
24824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SO - source file name
24834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeSourceFile;
24844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name == NULL)
24854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
24864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (minimize)
24874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            add_nlist = false;
24884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (N_SO_index != UINT32_MAX)
24894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
24904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // Set the size of the N_SO to the terminating index of this N_SO
24914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // so that we can always skip the entire N_SO if we need to navigate
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // more quickly at the source level when parsing STABS
24934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr = symtab->SymbolAtIndex(N_SO_index);
24944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr->SetByteSize(sym_idx + (minimize ? 0 : 1));
24954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr->SetSizeIsSibling(true);
24964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
24974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_NSYM_indexes.clear();
24984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_INCL_indexes.clear();
24994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_BRAC_indexes.clear();
25004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_COMM_indexes.clear();
25014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_FUN_indexes.clear();
25024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_SO_index = UINT32_MAX;
25034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
25044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
25054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
25064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // We use the current number of symbols in the symbol table in lieu of
25074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // using nlist_idx in case we ever start trimming entries out
25085fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        const bool N_SO_has_full_path = symbol_name[0] == '/';
25095fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        if (N_SO_has_full_path)
25105fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        {
25115fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            if (minimize && (N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
25125fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            {
25135fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // We have two consecutive N_SO entries where the first contains a directory
25145fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // and the second contains a full path.
25155fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                sym[sym_idx - 1].GetMangled().SetValue(symbol_name, false);
25165fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
25175fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                add_nlist = false;
25185fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            }
25195fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            else
25205fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            {
25215fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // This is the first entry in a N_SO that contains a directory or
25225fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // a full path to the source file
25235fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                N_SO_index = sym_idx;
25245fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            }
25255fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        }
25264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        else if (minimize && (N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
25274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
25285fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            // This is usually the second N_SO entry that contains just the filename,
25295fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            // so here we combine it with the first one if we are minimizing the symbol table
25304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const char *so_path = sym[sym_idx - 1].GetMangled().GetDemangledName().AsCString();
25314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (so_path && so_path[0])
253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
25334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                std::string full_so_path (so_path);
25344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (*full_so_path.rbegin() != '/')
25354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    full_so_path += '/';
25364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                full_so_path += symbol_name;
25374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx - 1].GetMangled().SetValue(full_so_path.c_str(), false);
25380ad086f3ab18d6927b9df2f79169607d3a5d90e4Greg Clayton                                add_nlist = false;
25394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
25414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
25424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
25434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabObjectFileName:
25474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_OSO - object file name: name,,0,0,st_mtime
25484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeObjectFile;
25494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLocalSymbol:
25524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LSYM - local sym: name,,NO_SECT,type,offset
25534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeLocal;
25544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
25574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // INCL scopes
25584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
25594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabBeginIncludeFileName:
25604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_BINCL - include file beginning: name,,NO_SECT,0,sum
25614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
25624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
25634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_INCL_indexes.push_back(sym_idx);
25644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeBegin;
25654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndIncludeFile:
25684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_EINCL - include file end: name,,NO_SECT,0,0
25694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_BINCL to the terminating index of this N_EINCL
25704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
25714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
25724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ( !N_INCL_indexes.empty() )
25734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
25744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(N_INCL_indexes.back());
25754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetByteSize(sym_idx + 1);
25764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetSizeIsSibling(true);
25774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_INCL_indexes.pop_back();
25784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
25794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeEnd;
25804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabIncludeFileName:
25834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SOL - #included file name: name,,n_sect,0,address
25844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeHeaderFile;
25854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We currently don't use the header files on darwin
25874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (minimize)
25884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        add_nlist = false;
25894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabCompilerParameters:
25924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_PARAMS - compiler parameters: name,,NO_SECT,0,0
25934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
25944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
25954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
25964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabCompilerVersion:
25974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_VERSION - compiler version: name,,NO_SECT,0,0
25984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
25994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabCompilerOptLevel:
26024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0
26034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
26044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabParameter:
26074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_PSYM - parameter: name,,NO_SECT,type,offset
26084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeVariable;
26094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabAlternateEntry:
26124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ENTRY - alternate entry: name,,n_sect,linenumber,address
26134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
26144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeLineEntry;
26154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
26184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // Left and Right Braces
26194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
26204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLeftBracket:
26214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address
26224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
26234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
26244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
26254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_BRAC_indexes.push_back(sym_idx);
26264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeBegin;
26274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabRightBracket:
26304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address
26314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_LBRAC to the terminating index of this N_RBRAC
26324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
26334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
26344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
26354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ( !N_BRAC_indexes.empty() )
26364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
26374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(N_BRAC_indexes.back());
26384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetByteSize(sym_idx + 1);
26394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetSizeIsSibling(true);
26404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_BRAC_indexes.pop_back();
26414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
26424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeEnd;
26434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabDeletedIncludeFile:
26464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_EXCL - deleted include file: name,,NO_SECT,0,sum
26474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeHeaderFile;
26484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
26514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // COMM scopes
26524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
26534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabBeginCommon:
26544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_BCOMM - begin common: name,,NO_SECT,0,0
26554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
26564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
26574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeBegin;
26584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_COMM_indexes.push_back(sym_idx);
26594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
26604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndCommonLocal:
26624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ECOML - end common (local name): 0,,n_sect,0,address
26634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
26644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Fall through
26654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
26664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndCommon:
26674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ECOMM - end common: name,,n_sect,0,0
26684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML
26694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
26704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
26714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ( !N_COMM_indexes.empty() )
26724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
26734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(N_COMM_indexes.back());
26744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetByteSize(sym_idx + 1);
26754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetSizeIsSibling(true);
26764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_COMM_indexes.pop_back();
26774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
26784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeEnd;
26794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLength:
26824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LENG - second stab entry with length information
26834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeAdditional;
26844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                default: break;
26874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
26884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
26894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            else
26904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
26914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //uint8_t n_pext    = NlistMaskPrivateExternal & nlist.n_type;
26924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                uint8_t n_type  = NlistMaskType & nlist.n_type;
26934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0);
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                switch (n_type)
26964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
26974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeIndirect:         // N_INDR - Fall through
26984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypePreboundUndefined:// N_PBUD - Fall through
26994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeUndefined:        // N_UNDF
27004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeUndefined;
27014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeAbsolute:         // N_ABS
27044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeAbsolute;
27054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeSection:          // N_SECT
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
27094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (symbol_section == NULL)
271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
27134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // TODO: warn about this?
27144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            add_nlist = false;
27153f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            break;
27164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (TEXT_eh_frame_sectID == nlist.n_sect)
27194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
27204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            type = eSymbolTypeException;
27214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
27224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        else
27234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
27244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            uint32_t section_type = symbol_section->Get() & SectionFlagMaskSectionType;
27253f69eacbb218a37390822c89d3675bd740590382Greg Clayton
27264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            switch (section_type)
27273f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
27284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeRegular:                     break; // regular section
27294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            //case SectionTypeZeroFill:                 type = eSymbolTypeData;    break; // zero fill on demand section
27304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeCStringLiterals:            type = eSymbolTypeData;    break; // section with only literal C strings
27314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionType4ByteLiterals:              type = eSymbolTypeData;    break; // section with only 4 byte literals
27324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionType8ByteLiterals:              type = eSymbolTypeData;    break; // section with only 8 byte literals
27334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeLiteralPointers:            type = eSymbolTypeTrampoline; break; // section with only pointers to literals
27344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeNonLazySymbolPointers:      type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers
27354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeLazySymbolPointers:         type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers
27364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeSymbolStubs:                type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field
27374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for initialization
27384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for termination
27394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            //case SectionTypeCoalesced:                type = eSymbolType;    break; // section contains symbols that are to be coalesced
27404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            //case SectionTypeZeroFillLarge:            type = eSymbolTypeData;    break; // zero fill on demand section (that can be larger than 4 gigabytes)
27414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeInterposing:                type = eSymbolTypeTrampoline;  break; // section with only pairs of function pointers for interposing
27424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionType16ByteLiterals:             type = eSymbolTypeData;    break; // section with only 16 byte literals
27434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeDTraceObjectFormat:         type = eSymbolTypeInstrumentation; break;
27444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeLazyDylibSymbolPointers:    type = eSymbolTypeTrampoline; break;
27454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            default: break;
27463f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (type == eSymbolTypeInvalid)
27493f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
27504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const char *symbol_sect_name = symbol_section->GetName().AsCString();
27514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_section->IsDescendant (text_section_sp.get()))
2752811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                                {
27534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_section->IsClear(SectionAttrUserPureInstructions |
27544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                                SectionAttrUserSelfModifyingCode |
27554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                                SectionAttrSytemSomeInstructions))
27564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeData;
27574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    else
27584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeCode;
2759811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                                }
27604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
27614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_section->IsDescendant(data_section_sp.get()))
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
27634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_sect_name && ::strstr (symbol_sect_name, "__objc") == symbol_sect_name)
276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
27654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeRuntime;
27663f69eacbb218a37390822c89d3675bd740590382Greg Clayton
27674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        if (symbol_name &&
27684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name[0] == '_' &&
27694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name[1] == 'O' &&
27704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name[2] == 'B')
27714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        {
27724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            llvm::StringRef symbol_name_ref(symbol_name);
27734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            static const llvm::StringRef g_objc_v2_prefix_class ("_OBJC_CLASS_$_");
27744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            static const llvm::StringRef g_objc_v2_prefix_metaclass ("_OBJC_METACLASS_$_");
27754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            static const llvm::StringRef g_objc_v2_prefix_ivar ("_OBJC_IVAR_$_");
27764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            if (symbol_name_ref.startswith(g_objc_v2_prefix_class))
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            {
27784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name_non_abi_mangled = symbol_name + 1;
27794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name = symbol_name + g_objc_v2_prefix_class.size();
27804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                type = eSymbolTypeObjCClass;
27814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            }
27824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            else if (symbol_name_ref.startswith(g_objc_v2_prefix_metaclass))
27834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            {
27844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name_non_abi_mangled = symbol_name + 1;
27854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
27864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                type = eSymbolTypeObjCMetaClass;
27874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            }
27884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            else if (symbol_name_ref.startswith(g_objc_v2_prefix_ivar))
27894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            {
27904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name_non_abi_mangled = symbol_name + 1;
27914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
27924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                type = eSymbolTypeObjCIVar;
279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            }
27943f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                        }
27953f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    }
27963f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    else
27974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_sect_name && ::strstr (symbol_sect_name, "__gcc_except_tab") == symbol_sect_name)
27983f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    {
27994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeException;
28003f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    }
28013f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    else
28023f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    {
28034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeData;
28044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    }
28054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
28064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
28074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_sect_name && ::strstr (symbol_sect_name, "__IMPORT") == symbol_sect_name)
28084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
28094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    type = eSymbolTypeTrampoline;
28104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
28114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
28124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_section->IsDescendant(objc_section_sp.get()))
28134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
28144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    type = eSymbolTypeRuntime;
28154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_name && symbol_name[0] == '.')
28164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    {
28174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        llvm::StringRef symbol_name_ref(symbol_name);
28184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        static const llvm::StringRef g_objc_v1_prefix_class (".objc_class_name_");
28194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        if (symbol_name_ref.startswith(g_objc_v1_prefix_class))
28203f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                        {
28214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name_non_abi_mangled = symbol_name;
28224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name = symbol_name + g_objc_v1_prefix_class.size();
28234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            type = eSymbolTypeObjCClass;
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        }
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
28273f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
28284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
28304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
28314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
28324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
28334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
28344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (add_nlist)
28354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
28364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                uint64_t symbol_value = nlist.n_value;
28374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                bool symbol_name_is_mangled = false;
28383f69eacbb218a37390822c89d3675bd740590382Greg Clayton
28394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symbol_name_non_abi_mangled)
28404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
28414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    sym[sym_idx].GetMangled().SetMangledName (symbol_name_non_abi_mangled);
28424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    sym[sym_idx].GetMangled().SetDemangledName (symbol_name);
28434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
28444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                else
28454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
28464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name && symbol_name[0] == '_')
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
28484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_name_is_mangled = symbol_name[1] == '_';
28494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_name++;  // Skip the leading underscore
28504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
28513f69eacbb218a37390822c89d3675bd740590382Greg Clayton
28524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name)
28534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
28544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        sym[sym_idx].GetMangled().SetValue(symbol_name, symbol_name_is_mangled);
28554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
28564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
28574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
28584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (is_debug == false)
28594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
28604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (type == eSymbolTypeCode)
28614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
28624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // See if we can find a N_FUN entry for any code symbols.
28634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // If we do find a match, and the name matches, then we
28644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // can merge the two into just the function symbol to avoid
28654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // duplicate entries in the symbol table
28664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        ValueToSymbolIndexMap::const_iterator pos = N_FUN_addr_to_sym_idx.find (nlist.n_value);
28674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (pos != N_FUN_addr_to_sym_idx.end())
28683f69eacbb218a37390822c89d3675bd740590382Greg Clayton                        {
28694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) ||
28704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName()))
28713f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
28724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
28734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // We just need the flags from the linker symbol, so put these flags
28744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // into the N_FUN flags to avoid duplicate symbols in the symbol table
28754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
28764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].Clear();
28774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                continue;
28783f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
28794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
28804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
28814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else if (type == eSymbolTypeData)
28824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
28834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // See if we can find a N_STSYM entry for any data symbols.
28844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // If we do find a match, and the name matches, then we
28854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // can merge the two into just the Static symbol to avoid
28864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // duplicate entries in the symbol table
28874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        ValueToSymbolIndexMap::const_iterator pos = N_STSYM_addr_to_sym_idx.find (nlist.n_value);
28884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (pos != N_STSYM_addr_to_sym_idx.end())
28894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
28904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) ||
28914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName()))
28923f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
28934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
28944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // We just need the flags from the linker symbol, so put these flags
28954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // into the N_STSYM flags to avoid duplicate symbols in the symbol table
28964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
28974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].Clear();
28984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                continue;
28993f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
29014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
29024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
29034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symbol_section)
29044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
29054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    const addr_t section_file_addr = symbol_section->GetFileAddress();
29064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_byte_size == 0 && function_starts_count > 0)
29074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
2908d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        addr_t symbol_lookup_file_addr = nlist.n_value;
2909d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        // Do an exact address match for non-ARM addresses, else get the closest since
2910d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        // the symbol might be a thumb symbol which has an address with bit zero set
2911d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        FunctionStarts::Entry *func_start_entry = function_starts.FindEntry (symbol_lookup_file_addr, !is_arm);
2912d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        if (is_arm && func_start_entry)
2913d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        {
2914d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            // Verify that the function start address is the symbol address (ARM)
2915d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            // or the symbol address + 1 (thumb)
2916d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            if (func_start_entry->addr != symbol_lookup_file_addr &&
2917d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                func_start_entry->addr != (symbol_lookup_file_addr + 1))
2918d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            {
2919d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                // Not the right entry, NULL it out...
2920d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                func_start_entry = NULL;
2921d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            }
2922d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        }
29234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (func_start_entry)
2924576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                        {
29254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            func_start_entry->data = true;
2926d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton
2927d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            addr_t symbol_file_addr = func_start_entry->addr;
2928d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            uint32_t symbol_flags = 0;
2929d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            if (is_arm)
2930d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            {
2931d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                if (symbol_file_addr & 1)
2932d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    symbol_flags = MACHO_NLIST_ARM_SYMBOL_IS_THUMB;
2933d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                symbol_file_addr &= 0xfffffffffffffffeull;
2934d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            }
2935d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton
29364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const FunctionStarts::Entry *next_func_start_entry = function_starts.FindNextEntry (func_start_entry);
29374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const addr_t section_end_file_addr = section_file_addr + symbol_section->GetByteSize();
29384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (next_func_start_entry)
2939576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                            {
2940d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                addr_t next_symbol_file_addr = next_func_start_entry->addr;
2941d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                // Be sure the clear the Thumb address bit when we calculate the size
2942d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                // from the current and next address
2943d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                if (is_arm)
2944d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    next_symbol_file_addr &= 0xfffffffffffffffeull;
2945d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                symbol_byte_size = std::min<lldb::addr_t>(next_symbol_file_addr - symbol_file_addr, section_end_file_addr - symbol_file_addr);
2946576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                            }
29474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            else
2948576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                            {
2949d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                symbol_byte_size = section_end_file_addr - symbol_file_addr;
2950576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                            }
2951576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                        }
29524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
29534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_value -= section_file_addr;
29544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetID (nlist_idx);
29574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetType (type);
29584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].GetAddress().SetSection (symbol_section);
29594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].GetAddress().SetOffset (symbol_value);
29604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symbol_byte_size > 0)
29634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    sym[sym_idx].SetByteSize(symbol_byte_size);
29644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                ++sym_idx;
29664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
29674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            else
29684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
29694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].Clear();
29704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
29714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
29734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // STAB N_GSYM entries end up having a symbol type eSymbolTypeGlobal and when the symbol value
29754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // is zero, the address of the global ends up being in a non-STAB entry. Try and fix up all
29764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // such entries by figuring out what the address for the global is by looking up this non-STAB
29774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // entry and copying the value into the debug symbol's value to save us the hassle in the
29784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // debug symbol parser.
29794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        Symbol *global_symbol = NULL;
29814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        for (nlist_idx = 0;
29824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton             nlist_idx < symtab_load_command.nsyms && (global_symbol = symtab->FindSymbolWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, nlist_idx)) != NULL;
29834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton             nlist_idx++)
29844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
29854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (global_symbol->GetAddress().GetFileAddress() == 0)
29864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
29874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                std::vector<uint32_t> indexes;
29884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symtab->AppendSymbolIndexesWithName (global_symbol->GetMangled().GetName(), indexes) > 0)
29894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
29904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    std::vector<uint32_t>::const_iterator pos;
29914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    std::vector<uint32_t>::const_iterator end = indexes.end();
29924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    for (pos = indexes.begin(); pos != end; ++pos)
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
29944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(*pos);
29954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (symbol_ptr != global_symbol && symbol_ptr->IsDebug() == false)
29964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
29974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            global_symbol->GetAddress() = symbol_ptr->GetAddress();
29984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            break;
29994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
30024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
30034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
30044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t synthetic_sym_id = symtab_load_command.nsyms;
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (function_starts_count > 0)
30084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
30094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            char synthetic_function_symbol[PATH_MAX];
30104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            uint32_t num_synthetic_function_symbols = 0;
30114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            for (i=0; i<function_starts_count; ++i)
30124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
30134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (function_starts.GetEntryRef (i).data == false)
30144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    ++num_synthetic_function_symbols;
30154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
30164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (num_synthetic_function_symbols > 0)
30184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
30194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (num_syms < sym_idx + num_synthetic_function_symbols)
30204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
30214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    num_syms = sym_idx + num_synthetic_function_symbols;
30224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    sym = symtab->Resize (num_syms);
30234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
30244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                uint32_t synthetic_function_symbol_idx = 0;
30254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                for (i=0; i<function_starts_count; ++i)
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
30274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    const FunctionStarts::Entry *func_start_entry = function_starts.GetEntryAtIndex (i);
30284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (func_start_entry->data == false)
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
3030d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        addr_t symbol_file_addr = func_start_entry->addr;
3031d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        uint32_t symbol_flags = 0;
3032d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        if (is_arm)
3033d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        {
3034d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            if (symbol_file_addr & 1)
3035d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                symbol_flags = MACHO_NLIST_ARM_SYMBOL_IS_THUMB;
3036d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            symbol_file_addr &= 0xfffffffffffffffeull;
3037d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        }
30384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        Address symbol_addr;
3039d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        if (module_sp->ResolveFileAddress (symbol_file_addr, symbol_addr))
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
30414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            SectionSP symbol_section (symbol_addr.GetSection());
30424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            uint32_t symbol_byte_size = 0;
30434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (symbol_section)
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
30454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const addr_t section_file_addr = symbol_section->GetFileAddress();
30464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const FunctionStarts::Entry *next_func_start_entry = function_starts.FindNextEntry (func_start_entry);
30474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const addr_t section_end_file_addr = section_file_addr + symbol_section->GetByteSize();
30484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (next_func_start_entry)
30494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
3050d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    addr_t next_symbol_file_addr = next_func_start_entry->addr;
3051d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    if (is_arm)
3052d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                        next_symbol_file_addr &= 0xfffffffffffffffeull;
3053d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    symbol_byte_size = std::min<lldb::addr_t>(next_symbol_file_addr - symbol_file_addr, section_end_file_addr - symbol_file_addr);
30544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
30554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
3057d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    symbol_byte_size = section_end_file_addr - symbol_file_addr;
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
30594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                snprintf (synthetic_function_symbol,
30604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          sizeof(synthetic_function_symbol),
30614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          "___lldb_unnamed_function%u$$%s",
30624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          ++synthetic_function_symbol_idx,
30634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          module_sp->GetFileSpec().GetFilename().GetCString());
30644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].SetID (synthetic_sym_id++);
30654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].GetMangled().SetDemangledName(synthetic_function_symbol);
30664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].SetType (eSymbolTypeCode);
30674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].SetIsSynthetic (true);
30684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].GetAddress() = symbol_addr;
3069d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                if (symbol_flags)
3070d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    sym[sym_idx].SetFlags (symbol_flags);
30714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_byte_size)
30724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    sym[sym_idx].SetByteSize (symbol_byte_size);
30734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                ++sym_idx;
307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
30784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
30794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
3080637029b85196806ce0f39271764efae43c888e85Greg Clayton
30814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // Trim our symbols down to just what we ended up with after
30824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // removing any symbols.
30834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (sym_idx < num_syms)
30844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
30854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            num_syms = sym_idx;
30864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            sym = symtab->Resize (num_syms);
30874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
3088637029b85196806ce0f39271764efae43c888e85Greg Clayton
30894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // Now synthesize indirect symbols
30904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (m_dysymtab.nindirectsyms != 0)
30914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
30924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            DataExtractor indirect_symbol_index_data (m_data, m_dysymtab.indirectsymoff, m_dysymtab.nindirectsyms * 4);
30934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (indirect_symbol_index_data.GetByteSize())
30954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
30964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                NListIndexToSymbolIndexMap::const_iterator end_index_pos = m_nlist_idx_to_sym_idx.end();
309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                for (uint32_t sect_idx = 1; sect_idx < m_mach_sections.size(); ++sect_idx)
30994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
31004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ((m_mach_sections[sect_idx].flags & SectionFlagMaskSectionType) == SectionTypeSymbolStubs)
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
31024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        uint32_t symbol_stub_byte_size = m_mach_sections[sect_idx].reserved2;
31034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (symbol_stub_byte_size == 0)
31044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            continue;
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        const uint32_t num_symbol_stubs = m_mach_sections[sect_idx].size / symbol_stub_byte_size;
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (num_symbol_stubs == 0)
31094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            continue;
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        const uint32_t symbol_stub_index_offset = m_mach_sections[sect_idx].reserved1;
31124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        for (uint32_t stub_idx = 0; stub_idx < num_symbol_stubs; ++stub_idx)
31134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
31144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const uint32_t symbol_stub_index = symbol_stub_index_offset + stub_idx;
31154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const lldb::addr_t symbol_stub_addr = m_mach_sections[sect_idx].addr + (stub_idx * symbol_stub_byte_size);
31164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            uint32_t symbol_stub_offset = symbol_stub_index * 4;
31174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (indirect_symbol_index_data.ValidOffsetForDataOfSize(symbol_stub_offset, 4))
31184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            {
31194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const uint32_t stub_sym_id = indirect_symbol_index_data.GetU32 (&symbol_stub_offset);
31204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (stub_sym_id & (IndirectSymbolAbsolute | IndirectSymbolLocal))
312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    continue;
312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                NListIndexToSymbolIndexMap::const_iterator index_pos = m_nlist_idx_to_sym_idx.find (stub_sym_id);
31244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                Symbol *stub_symbol = NULL;
31254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (index_pos != end_index_pos)
312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
31274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // We have a remapping from the original nlist index to
31284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // a current symbol index, so just look this up by index
31294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    stub_symbol = symtab->SymbolAtIndex (index_pos->second);
31304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
31314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
31324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
31334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // We need to lookup a symbol using the original nlist
31344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // symbol index since this index is coming from the
31354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // S_SYMBOL_STUBS
31364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    stub_symbol = symtab->FindSymbolByID (stub_sym_id);
31374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
31380ad086f3ab18d6927b9df2f79169607d3a5d90e4Greg Clayton
31394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                assert (stub_symbol);
31404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (stub_symbol)
31414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
31424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    Address so_addr(symbol_stub_addr, section_list);
314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (stub_symbol->GetType() == eSymbolTypeUndefined)
31454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    {
31464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // Change the external symbol into a trampoline that makes sense
31474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // These symbols were N_UNDF N_EXT, and are useless to us, so we
31484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // can re-use them so we don't have to make up a synthetic symbol
31494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // for no good reason.
31504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->SetType (eSymbolTypeTrampoline);
31514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->SetExternal (false);
31524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->GetAddress() = so_addr;
31534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->SetByteSize (symbol_stub_byte_size);
31544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    }
31554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    else
31564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    {
31574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // Make a synthetic symbol to describe the trampoline stub
31582a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        Mangled stub_symbol_mangled_name(stub_symbol->GetMangled());
31594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        if (sym_idx >= num_syms)
31602a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        {
31614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            sym = symtab->Resize (++num_syms);
31622a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                            stub_symbol = NULL;  // this pointer no longer valid
31632a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        }
31644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetID (synthetic_sym_id++);
31652a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        sym[sym_idx].GetMangled() = stub_symbol_mangled_name;
31664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetType (eSymbolTypeTrampoline);
31674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetIsSynthetic (true);
31684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].GetAddress() = so_addr;
31694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetByteSize (symbol_stub_byte_size);
31704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        ++sym_idx;
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        return symtab->GetNumSymbols();
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::Dump (Stream *s)
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
31899482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
31909482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    {
31919482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
31929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->Printf("%p: ", this);
31939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->Indent();
31949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_header.magic == HeaderMagic64 || m_header.magic == HeaderMagic64Swapped)
31959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            s->PutCString("ObjectFileMachO64");
31969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        else
31979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            s->PutCString("ObjectFileMachO32");
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n";
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32039482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_sections_ap.get())
32049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_sections_ap->Dump(s, NULL, true, UINT32_MAX);
320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_symtab_ap.get())
32079482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap->Dump(s, NULL, eSortOrderNone);
32089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    }
320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32130467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg ClaytonObjectFileMachO::GetUUID (lldb_private::UUID* uuid)
321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
32169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
32199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct uuid_command load_cmd;
32209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
32219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
32229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t cmd_offset = offset;
32259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
32269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
32279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
32289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (load_cmd.cmd == LoadCommandUUID)
322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
32309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const uint8_t *uuid_bytes = m_data.PeekData(offset, 16);
32319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (uuid_bytes)
32329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
32339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    uuid->SetBytes (uuid_bytes);
32349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    return true;
32359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
32369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                return false;
323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetDependentModules (FileSpecList& files)
324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
32499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
32509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
32539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct load_command load_cmd;
32549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
32559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        const bool resolve_path = false; // Don't resolve the dependend file paths since they may not reside on this system
32569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
32579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t cmd_offset = offset;
32609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
32619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
32629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
32639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            switch (load_cmd.cmd)
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
32659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibLoad:
32669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibLoadWeak:
32679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibReexport:
32689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDynamicLinkerLoad:
32699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandFixedVMShlibLoad:
32709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibLoadUpward:
327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
32729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    uint32_t name_offset = cmd_offset + m_data.GetU32(&offset);
32739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    const char *path = m_data.PeekCStr(name_offset);
32749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // Skip any path that starts with '@' since these are usually:
32759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // @executable_path/.../file
32769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // @rpath/.../file
32779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (path && path[0] != '@')
32789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
32799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        FileSpec file_spec(path, resolve_path);
32809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (files.AppendIfUnique(file_spec))
32819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            count++;
32829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
32849482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            default:
32879482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
32889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
32899482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return count;
329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32952877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Inghamlldb_private::Address
32962877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim InghamObjectFileMachO::GetEntryPointAddress ()
32972877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham{
32982877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // If the object file is not an executable it can't hold the entry point.  m_entry_point_address
32992877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // is initialized to an invalid address, so we can just return that.
33002877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // If m_entry_point_address is valid it means we've found it already, so return the cached value.
33012877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
33022877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    if (!IsExecutable() || m_entry_point_address.IsValid())
33032877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        return m_entry_point_address;
33042877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
33052877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // Otherwise, look for the UnixThread or Thread command.  The data for the Thread command is given in
33062877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // /usr/include/mach-o.h, but it is basically:
33072877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
33082877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  uint32_t flavor  - this is the flavor argument you would pass to thread_get_state
33092877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  uint32_t count   - this is the count of longs in the thread state data
33102877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  struct XXX_thread_state state - this is the structure from <machine/thread_status.h> corresponding to the flavor.
33112877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  <repeat this trio>
33122877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
33132877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // So we just keep reading the various register flavors till we find the GPR one, then read the PC out of there.
33142877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // FIXME: We will need to have a "RegisterContext data provider" class at some point that can get all the registers
33152877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // out of data in this form & attach them to a given thread.  That should underlie the MacOS X User process plugin,
33162877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // and we'll also need it for the MacOS X Core File process plugin.  When we have that we can also use it here.
33172877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
33182877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // For now we hard-code the offsets and flavors we need:
33192877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
33202877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
33212877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
33229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
33239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
33242877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    {
33259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
33269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct load_command load_cmd;
33279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
33289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
33299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb::addr_t start_address = LLDB_INVALID_ADDRESS;
33309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        bool done = false;
33319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
33329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
33332877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        {
33349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t cmd_offset = offset;
33359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
33369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
33379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
33389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            switch (load_cmd.cmd)
33392877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham            {
33409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandUnixThread:
33419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandThread:
33422877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                {
33439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    while (offset < cmd_offset + load_cmd.cmdsize)
33442877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                    {
33459482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        uint32_t flavor = m_data.GetU32(&offset);
33469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        uint32_t count = m_data.GetU32(&offset);
33479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (count == 0)
33489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        {
33499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            // We've gotten off somehow, log and exit;
33509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            return m_entry_point_address;
33512877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                        }
33529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
33539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        switch (m_header.cputype)
33549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        {
33559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        case llvm::MachO::CPUTypeARM:
33569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           if (flavor == 1) // ARM_THREAD_STATE from mach/arm/thread_status.h
33579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           {
33589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               offset += 60;  // This is the offset of pc in the GPR thread state data structure.
33599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               start_address = m_data.GetU32(&offset);
33609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               done = true;
33619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            }
33629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
33639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        case llvm::MachO::CPUTypeI386:
33649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           if (flavor == 1) // x86_THREAD_STATE32 from mach/i386/thread_status.h
33659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           {
33669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               offset += 40;  // This is the offset of eip in the GPR thread state data structure.
33679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               start_address = m_data.GetU32(&offset);
33689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               done = true;
33699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            }
33709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
33719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        case llvm::MachO::CPUTypeX86_64:
33729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           if (flavor == 4) // x86_THREAD_STATE64 from mach/i386/thread_status.h
33739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           {
33749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               offset += 16 * 8;  // This is the offset of rip in the GPR thread state data structure.
33759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               start_address = m_data.GetU64(&offset);
33769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               done = true;
33779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            }
33789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
33799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        default:
33809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            return m_entry_point_address;
33812877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                        }
33829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // Haven't found the GPR flavor yet, skip over the data for this flavor:
33839482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (done)
33849482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            break;
33859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        offset += count * 4;
33862877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                    }
33872877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                }
33889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
33899482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandMain:
33906e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan                {
33919482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    ConstString text_segment_name ("__TEXT");
33929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    uint64_t entryoffset = m_data.GetU64(&offset);
33939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    SectionSP text_segment_sp = GetSectionList()->FindSectionByName(text_segment_name);
33949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (text_segment_sp)
33959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
33969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        done = true;
33979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        start_address = text_segment_sp->GetFileAddress() + entryoffset;
33989482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
33996e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan                }
34009482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
34019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            default:
34029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
34036e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            }
34049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (done)
34059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
34062877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
34079482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // Go to the next load command:
34089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
34092877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        }
34109482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
34119482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (start_address != LLDB_INVALID_ADDRESS)
34122877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        {
34139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // We got the start address from the load commands, so now resolve that address in the sections
34149482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // of this ObjectFile:
34159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (!m_entry_point_address.ResolveAddressUsingFileSections (start_address, GetSectionList()))
34169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            {
34179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                m_entry_point_address.Clear();
34189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
34192877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        }
34209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        else
34213508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        {
34229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // We couldn't read the UnixThread load command - maybe it wasn't there.  As a fallback look for the
34239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // "start" symbol in the main executable.
34249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
34259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ModuleSP module_sp (GetModule());
34269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
34279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (module_sp)
34283508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            {
34299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                SymbolContextList contexts;
34309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                SymbolContext context;
34319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (module_sp->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts))
34329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
34339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (contexts.GetContextAtIndex(0, context))
34349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        m_entry_point_address = context.symbol->GetAddress();
34359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
34363508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            }
34373508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        }
34382877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    }
34392877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
34402877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    return m_entry_point_address;
34412877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
34422877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham}
34432877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
3444b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonlldb_private::Address
3445b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetHeaderAddress ()
3446b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
3447b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    lldb_private::Address header_addr;
3448b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    SectionList *section_list = GetSectionList();
3449b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (section_list)
3450b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
3451b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        SectionSP text_segment_sp (section_list->FindSectionByName (GetSegmentNameTEXT()));
3452b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (text_segment_sp)
3453b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
34543508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            header_addr.SetSection (text_segment_sp);
3455b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            header_addr.SetOffset (0);
3456b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
3457b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
3458b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return header_addr;
3459b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
3460b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
346146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonuint32_t
346246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonObjectFileMachO::GetNumThreadContexts ()
346346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
34649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
34659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
346646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
34679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
34689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (!m_thread_context_offsets_valid)
346946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
34709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_thread_context_offsets_valid = true;
34719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
34729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            FileRangeArray::Entry file_range;
34739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            thread_command thread_cmd;
34749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            for (uint32_t i=0; i<m_header.ncmds; ++i)
347546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
34769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const uint32_t cmd_offset = offset;
34779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (m_data.GetU32(&offset, &thread_cmd, 2) == NULL)
34789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    break;
34799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
34809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (thread_cmd.cmd == LoadCommandThread)
34819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
34829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    file_range.SetRangeBase (offset);
34839482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    file_range.SetByteSize (thread_cmd.cmdsize - 8);
34849482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    m_thread_context_offsets.Append (file_range);
34859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
34869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                offset = cmd_offset + thread_cmd.cmdsize;
348746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
348846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
348946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
349046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return m_thread_context_offsets.GetSize();
349146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
349246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
349346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::RegisterContextSP
349446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonObjectFileMachO::GetThreadContextAtIndex (uint32_t idx, lldb_private::Thread &thread)
349546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
349646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    lldb::RegisterContextSP reg_ctx_sp;
34979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
34989482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
34999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
350046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
35019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
35029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (!m_thread_context_offsets_valid)
35039482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            GetNumThreadContexts ();
35049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
35059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        const FileRangeArray::Entry *thread_context_file_range = m_thread_context_offsets.GetEntryAtIndex (idx);
35069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
35079482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        DataExtractor data (m_data,
35089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            thread_context_file_range->GetRangeBase(),
35099482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            thread_context_file_range->GetByteSize());
35109482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
35119482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        switch (m_header.cputype)
35129482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
35139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case llvm::MachO::CPUTypeARM:
35149482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                reg_ctx_sp.reset (new RegisterContextDarwin_arm_Mach (thread, data));
35159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
35169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
35179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case llvm::MachO::CPUTypeI386:
35189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                reg_ctx_sp.reset (new RegisterContextDarwin_i386_Mach (thread, data));
35199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
35209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
35219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case llvm::MachO::CPUTypeX86_64:
35229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                reg_ctx_sp.reset (new RegisterContextDarwin_x86_64_Mach (thread, data));
35239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
35249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
352546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
352646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return reg_ctx_sp;
352746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
352846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
3529b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
3530ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFile::Type
3531ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFileMachO::CalculateType()
3532ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton{
3533ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    switch (m_header.filetype)
3534ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    {
3535ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeObject:                                          // 0x1u MH_OBJECT
3536ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            if (GetAddressByteSize () == 4)
3537ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            {
3538ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // 32 bit kexts are just object files, but they do have a valid
3539ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // UUID load command.
3540ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                UUID uuid;
3541ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                if (GetUUID(&uuid))
3542ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                {
3543ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // this checking for the UUID load command is not enough
3544ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // we could eventually look for the symbol named
3545ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // "OSKextGetCurrentIdentifier" as this is required of kexts
3546ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    if (m_strata == eStrataInvalid)
3547ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                        m_strata = eStrataKernel;
3548ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    return eTypeSharedLibrary;
3549ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                }
3550ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            }
3551ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            return eTypeObjectFile;
3552ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
3553ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeExecutable:          return eTypeExecutable;     // 0x2u MH_EXECUTE
3554ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeFixedVMShlib:        return eTypeSharedLibrary;  // 0x3u MH_FVMLIB
3555ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeCore:                return eTypeCoreFile;       // 0x4u MH_CORE
3556ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypePreloadedExecutable: return eTypeSharedLibrary;  // 0x5u MH_PRELOAD
3557ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlib:        return eTypeSharedLibrary;  // 0x6u MH_DYLIB
3558ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicLinkEditor:   return eTypeDynamicLinker;  // 0x7u MH_DYLINKER
3559ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeBundle:              return eTypeSharedLibrary;  // 0x8u MH_BUNDLE
3560ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlibStub:    return eTypeStubLibrary;    // 0x9u MH_DYLIB_STUB
3561ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDSYM:                return eTypeDebugInfo;      // 0xAu MH_DSYM
3562ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeKextBundle:          return eTypeSharedLibrary;  // 0xBu MH_KEXT_BUNDLE
3563ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        default:
3564ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            break;
3565ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    }
3566ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    return eTypeUnknown;
3567ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton}
3568ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
3569ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFile::Strata
3570ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFileMachO::CalculateStrata()
3571ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton{
3572ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    switch (m_header.filetype)
3573ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    {
3574ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeObject:      // 0x1u MH_OBJECT
3575ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            {
3576ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // 32 bit kexts are just object files, but they do have a valid
3577ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // UUID load command.
3578ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                UUID uuid;
3579ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                if (GetUUID(&uuid))
3580ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                {
3581ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // this checking for the UUID load command is not enough
3582ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // we could eventually look for the symbol named
3583ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // "OSKextGetCurrentIdentifier" as this is required of kexts
3584ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    if (m_type == eTypeInvalid)
3585ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                        m_type = eTypeSharedLibrary;
3586ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
3587ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    return eStrataKernel;
3588ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                }
3589ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            }
3590ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            return eStrataUnknown;
3591ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
3592ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeExecutable:                                     // 0x2u MH_EXECUTE
3593ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            // Check for the MH_DYLDLINK bit in the flags
3594ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            if (m_header.flags & HeaderFlagBitIsDynamicLinkObject)
3595ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            {
3596ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                return eStrataUser;
3597ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            }
3598ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            else
3599ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            {
3600ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                SectionList *section_list = GetSectionList();
3601ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                if (section_list)
3602ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                {
3603ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                    static ConstString g_kld_section_name ("__KLD");
3604ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                    if (section_list->FindSectionByName(g_kld_section_name))
3605ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                        return eStrataKernel;
3606ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                }
3607ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            }
3608ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            return eStrataRawImage;
3609ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
3610ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeFixedVMShlib:        return eStrataUser;         // 0x3u MH_FVMLIB
3611ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeCore:                return eStrataUnknown;      // 0x4u MH_CORE
3612ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan        case HeaderFileTypePreloadedExecutable: return eStrataRawImage;     // 0x5u MH_PRELOAD
3613ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlib:        return eStrataUser;         // 0x6u MH_DYLIB
3614ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicLinkEditor:   return eStrataUser;         // 0x7u MH_DYLINKER
3615ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeBundle:              return eStrataUser;         // 0x8u MH_BUNDLE
3616ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlibStub:    return eStrataUser;         // 0x9u MH_DYLIB_STUB
3617ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDSYM:                return eStrataUnknown;      // 0xAu MH_DSYM
3618ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeKextBundle:          return eStrataKernel;       // 0xBu MH_KEXT_BUNDLE
3619ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        default:
3620ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            break;
3621ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    }
3622ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    return eStrataUnknown;
3623ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton}
3624ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
3625ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
362649f4bf21e0fb7675d67f95dafe66a098d3205650Greg Claytonuint32_t
362749f4bf21e0fb7675d67f95dafe66a098d3205650Greg ClaytonObjectFileMachO::GetVersion (uint32_t *versions, uint32_t num_versions)
362849f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton{
36299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
36309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
363149f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton    {
36329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
36339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct dylib_command load_cmd;
36349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t offset = MachHeaderSizeFromMagic(m_header.magic);
36359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t version_cmd = 0;
36369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint64_t version = 0;
36379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
36389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
363949f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        {
36409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t cmd_offset = offset;
36419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
36429482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
36439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
36449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (load_cmd.cmd == LoadCommandDylibIdent)
364549f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton            {
36469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (version_cmd == 0)
36479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
36489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    version_cmd = load_cmd.cmd;
36499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (m_data.GetU32(&offset, &load_cmd.dylib, 4) == NULL)
36509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
36519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    version = load_cmd.dylib.current_version;
36529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
36539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break; // Break for now unless there is another more complete version
36549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                       // number load command in the future.
365549f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton            }
36569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
365749f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        }
36589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
36599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (version_cmd == LoadCommandDylibIdent)
366049f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        {
36619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (versions != NULL && num_versions > 0)
36629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            {
36639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (num_versions > 0)
36649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[0] = (version & 0xFFFF0000ull) >> 16;
36659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (num_versions > 1)
36669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[1] = (version & 0x0000FF00ull) >> 8;
36679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (num_versions > 2)
36689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[2] = (version & 0x000000FFull);
36699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                // Fill in an remaining version numbers with invalid values
36709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                for (i=3; i<num_versions; ++i)
36719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[i] = UINT32_MAX;
36729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
36739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // The LC_ID_DYLIB load command has a version with 3 version numbers
36749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // in it, so always return 3
36759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            return 3;
367649f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        }
367749f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton    }
367849f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton    return false;
367949f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton}
368049f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton
368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3682395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonObjectFileMachO::GetArchitecture (ArchSpec &arch)
368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36849482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
36859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
36866a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton    {
36879482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
36889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        arch.SetArchitecture (eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
36899482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
36909482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // Files with type MH_PRELOAD are currently used in cases where the image
36919482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // debugs at the addresses in the file itself. Below we set the OS to
36929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // unknown to make sure we use the DynamicLoaderStatic()...
36939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_header.filetype == HeaderFileTypePreloadedExecutable)
36949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
36959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            arch.GetTriple().setOS (llvm::Triple::UnknownOS);
36969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
36979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        return true;
36986a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton    }
36999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    return false;
370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
370124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
370624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginName()
370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "ObjectFileMachO";
371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetShortPluginName()
371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
371524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginVersion()
372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
372324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724