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
15d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton#include "lldb/lldb-private-log.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ArchSpec.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBuffer.h"
18adf9e3db9be8f32e7eda7d4bb5b3b8f4d59ce46dJason Molenda#include "lldb/Core/Debugger.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpecList.h"
20d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton#include "lldb/Core/Log.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
2236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton#include "lldb/Core/ModuleSpec.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
246f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton#include "lldb/Core/RangeMap.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UUID.h"
30df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
31df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/FileSpec.h"
323e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan#include "lldb/Symbol/ClangNamespaceDecl.h"
33d793839192c6351a1615cf723564ef672bd8b877Jason Molenda#include "lldb/Symbol/DWARFCallFrameInfo.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#include "lldb/Target/Platform.h"
36b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h"
3729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#include "lldb/Target/Target.h"
389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/Process/Utility/RegisterContextDarwin_arm.h"
399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/Process/Utility/RegisterContextDarwin_i386.h"
4046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "Plugins/Process/Utility/RegisterContextDarwin_x86_64.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda#if defined (__APPLE__) && defined (__arm__)
4345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda// GetLLDBSharedCacheUUID() needs to call dlsym()
4445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda#include <dlfcn.h>
4545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda#endif
4645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
473e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea#ifndef __APPLE__
483e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea#include "Utility/UuidCompatibility.h"
493e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea#endif
503e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonusing namespace llvm::MachO;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
559badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molendaclass RegisterContextDarwin_x86_64_Mach : public RegisterContextDarwin_x86_64
5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonpublic:
5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    RegisterContextDarwin_x86_64_Mach (lldb_private::Thread &thread, const DataExtractor &data) :
5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        RegisterContextDarwin_x86_64 (thread, 0)
6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetRegisterDataFrom_LC_THREAD (data);
6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
6346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
6446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual void
6546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    InvalidateAllRegisters ()
6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // Do nothing... registers are always valid...
6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
7046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    void
7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    SetRegisterDataFrom_LC_THREAD (const DataExtractor &data)
7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
7336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
7446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetError (GPRRegSet, Read, -1);
7546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetError (FPURegSet, Read, -1);
7646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        SetError (EXCRegSet, Read, -1);
779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        bool done = false;
789badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        while (!done)
8046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            int flavor = data.GetU32 (&offset);
829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (flavor == 0)
839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                done = true;
849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            else
8546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t i;
879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t count = data.GetU32 (&offset);
889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                switch (flavor)
899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                {
909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case GPRRegSet:
919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        for (i=0; i<count; ++i)
929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            (&gpr.rax)[i] = data.GetU64(&offset);
939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (GPRRegSet, Read, 0);
949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
959badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case FPURegSet:
989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // TODO: fill in FPU regs....
999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        //SetError (FPURegSet, Read, -1);
1009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
1019badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case EXCRegSet:
1049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.trapno = data.GetU32(&offset);
1059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.err = data.GetU32(&offset);
1069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.faultvaddr = data.GetU64(&offset);
1079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (EXCRegSet, Read, 0);
1089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
1099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 7:
1119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 8:
1129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 9:
1139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // fancy flavors that encapsulate of the the above
1149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // falvors...
1159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1169badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    default:
1189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
1199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
1209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                }
12146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
1229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
1239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1249ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonprotected:
1259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
1279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1309badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
1339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1369badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
1399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1429badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr)
1459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1489badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu)
1519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1549badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
1569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc)
1579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
1599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton};
16146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1639badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molendaclass RegisterContextDarwin_i386_Mach : public RegisterContextDarwin_i386
1649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonpublic:
1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_i386_Mach (lldb_private::Thread &thread, const DataExtractor &data) :
1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_i386 (thread, 0)
1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetRegisterDataFrom_LC_THREAD (data);
1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1719badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual void
1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    InvalidateAllRegisters ()
1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Do nothing... registers are always valid...
1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1779badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    void
1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    SetRegisterDataFrom_LC_THREAD (const DataExtractor &data)
1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
18136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (GPRRegSet, Read, -1);
1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (FPURegSet, Read, -1);
1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (EXCRegSet, Read, -1);
1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        bool done = false;
1869badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        while (!done)
1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            int flavor = data.GetU32 (&offset);
1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (flavor == 0)
1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                done = true;
1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            else
19346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t i;
1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                uint32_t count = data.GetU32 (&offset);
1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                switch (flavor)
1979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                {
1989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case GPRRegSet:
1999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        for (i=0; i<count; ++i)
2009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            (&gpr.eax)[i] = data.GetU32(&offset);
2019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (GPRRegSet, Read, 0);
2029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
2039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case FPURegSet:
2069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // TODO: fill in FPU regs....
2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        //SetError (FPURegSet, Read, -1);
2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case EXCRegSet:
2129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.trapno = data.GetU32(&offset);
2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.err = data.GetU32(&offset);
2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        exc.faultvaddr = data.GetU32(&offset);
2159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        SetError (EXCRegSet, Read, 0);
2169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
2179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 7:
2199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 8:
2209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    case 9:
2219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // fancy flavors that encapsulate of the the above
2229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        // falvors...
2239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2249badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    default:
2269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        done = true;
2279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        break;
2289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                }
22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
23046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
23146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
23246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonprotected:
23346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
23446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
23546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
23646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
23746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2389badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
23946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
24046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
24146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
24346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2449badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2509badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr)
25346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
25446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
25546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2569badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
25746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
25846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu)
25946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
26046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
26146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2629badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
26346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    virtual int
26446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc)
26546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
26646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return 0;
26746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
26846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton};
26946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
2709badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molendaclass RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm
2719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonpublic:
2739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    RegisterContextDarwin_arm_Mach (lldb_private::Thread &thread, const DataExtractor &data) :
274b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton        RegisterContextDarwin_arm (thread, 0)
2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetRegisterDataFrom_LC_THREAD (data);
2779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2789badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual void
2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    InvalidateAllRegisters ()
2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Do nothing... registers are always valid...
2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2849badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    void
2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    SetRegisterDataFrom_LC_THREAD (const DataExtractor &data)
2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
28836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
2899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (GPRRegSet, Read, -1);
2909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (FPURegSet, Read, -1);
2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        SetError (EXCRegSet, Read, -1);
2923b244b7e347e23b4483acc947296ade053432637Jason Molenda        bool done = false;
2933b244b7e347e23b4483acc947296ade053432637Jason Molenda
2943b244b7e347e23b4483acc947296ade053432637Jason Molenda        while (!done)
2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
2963b244b7e347e23b4483acc947296ade053432637Jason Molenda            int flavor = data.GetU32 (&offset);
2973b244b7e347e23b4483acc947296ade053432637Jason Molenda            uint32_t count = data.GetU32 (&offset);
2980c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda            lldb::offset_t next_thread_state = offset + (count * 4);
2993b244b7e347e23b4483acc947296ade053432637Jason Molenda            switch (flavor)
3003b244b7e347e23b4483acc947296ade053432637Jason Molenda            {
3013b244b7e347e23b4483acc947296ade053432637Jason Molenda                case GPRRegSet:
3023b244b7e347e23b4483acc947296ade053432637Jason Molenda                    for (uint32_t i=0; i<count; ++i)
3030c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    {
3043b244b7e347e23b4483acc947296ade053432637Jason Molenda                        gpr.r[i] = data.GetU32(&offset);
3050c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    }
3060c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda
3070c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    // Note that gpr.cpsr is also copied by the above loop; this loop technically extends
3080c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    // one element past the end of the gpr.r[] array.
3090c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda
3103b244b7e347e23b4483acc947296ade053432637Jason Molenda                    SetError (GPRRegSet, Read, 0);
3110c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    offset = next_thread_state;
3123b244b7e347e23b4483acc947296ade053432637Jason Molenda                    break;
3133b244b7e347e23b4483acc947296ade053432637Jason Molenda
3143b244b7e347e23b4483acc947296ade053432637Jason Molenda                case FPURegSet:
3153b244b7e347e23b4483acc947296ade053432637Jason Molenda                    {
3162f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                        uint8_t  *fpu_reg_buf = (uint8_t*) &fpu.floats.s[0];
3172f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                        const int fpu_reg_buf_size = sizeof (fpu.floats);
3182f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                        if (data.ExtractBytes (offset, fpu_reg_buf_size, eByteOrderLittle, fpu_reg_buf) == fpu_reg_buf_size)
3193b244b7e347e23b4483acc947296ade053432637Jason Molenda                        {
3202f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                            offset += fpu_reg_buf_size;
3212f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                            fpu.fpscr = data.GetU32(&offset);
3222f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                            SetError (FPURegSet, Read, 0);
3232f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                        }
3242f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                        else
3252f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                        {
3262f0387654349206d14af7ba8a724cedeade12e35Jason Molenda                            done = true;
3273b244b7e347e23b4483acc947296ade053432637Jason Molenda                        }
3283b244b7e347e23b4483acc947296ade053432637Jason Molenda                    }
3290c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    offset = next_thread_state;
3303b244b7e347e23b4483acc947296ade053432637Jason Molenda                    break;
3313b244b7e347e23b4483acc947296ade053432637Jason Molenda
3323b244b7e347e23b4483acc947296ade053432637Jason Molenda                case EXCRegSet:
3330c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    if (count == 3)
3340c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    {
3350c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                        exc.exception = data.GetU32(&offset);
3360c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                        exc.fsr = data.GetU32(&offset);
3370c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                        exc.far = data.GetU32(&offset);
3380c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                        SetError (EXCRegSet, Read, 0);
3390c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    }
3403b244b7e347e23b4483acc947296ade053432637Jason Molenda                    done = true;
3410c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda                    offset = next_thread_state;
3423b244b7e347e23b4483acc947296ade053432637Jason Molenda                    break;
3433b244b7e347e23b4483acc947296ade053432637Jason Molenda
3443b244b7e347e23b4483acc947296ade053432637Jason Molenda                // Unknown register set flavor, stop trying to parse.
3453b244b7e347e23b4483acc947296ade053432637Jason Molenda                default:
3463b244b7e347e23b4483acc947296ade053432637Jason Molenda                    done = true;
3473b244b7e347e23b4483acc947296ade053432637Jason Molenda            }
3489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
3499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3509ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonprotected:
3519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
3539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3540c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda        return -1;
3559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3569badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
3579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
3599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3600c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda        return -1;
3619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3629badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
3639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
3659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3660c7c90a807bd2718c1aff63aa84ab14e86e02c29Jason Molenda        return -1;
3679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
368b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton
369b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    virtual int
370b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    DoReadDBG (lldb::tid_t tid, int flavor, DBG &dbg)
371b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    {
372b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton        return -1;
373b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    }
3749badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
3759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr)
3779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3809badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
3819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu)
3839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3869badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
3879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    virtual int
3889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc)
3899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return 0;
3919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3929badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
393b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    virtual int
394b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    DoWriteDBG (lldb::tid_t tid, int flavor, const DBG &dbg)
395b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    {
396b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton        return -1;
397b5431d08d0dfb961ea0833ec485f11b9aa3541d1Greg Clayton    }
3989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton};
3999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
40095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Claytonstatic uint32_t
40195fd285b13f437e29181c3d4bb9b6aeab62e013eGreg ClaytonMachHeaderSizeFromMagic(uint32_t magic)
40295fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton{
40395fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton    switch (magic)
40495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton    {
40595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton        case HeaderMagic32:
40695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton        case HeaderMagic32Swapped:
40795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton            return sizeof(struct mach_header);
40895fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton
40995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton        case HeaderMagic64:
41095fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton        case HeaderMagic64Swapped:
41195fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton            return sizeof(struct mach_header_64);
41295fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton            break;
41395fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton
41495fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton        default:
41595fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton            break;
41695fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton    }
41795fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton    return 0;
41895fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton}
41995fd285b13f437e29181c3d4bb9b6aeab62e013eGreg Clayton
420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#define MACHO_NLIST_ARM_SYMBOL_IS_THUMB 0x0008
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::Initialize()
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::RegisterPlugin (GetPluginNameStatic(),
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   GetPluginDescriptionStatic(),
427b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                   CreateInstance,
42836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                   CreateMemoryInstance,
42936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                   GetModuleSpecifications);
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::Terminate()
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4390e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginNameStatic()
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4420e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static ConstString g_name("mach-o");
4430e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return g_name;
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginDescriptionStatic()
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "Mach-o object file reader (32 and 64 bit)";
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
453cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFileMachO::CreateInstance (const lldb::ModuleSP &module_sp,
454cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 DataBufferSP& data_sp,
455cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 lldb::offset_t data_offset,
456cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 const FileSpec* file,
457cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 lldb::offset_t file_offset,
458cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 lldb::offset_t length)
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
460cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    if (!data_sp)
461cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    {
462cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        data_sp = file->MemoryMapFileContents(file_offset, length);
463cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        data_offset = 0;
464cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    }
465cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton
466cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    if (ObjectFileMachO::MagicBytesMatch(data_sp, data_offset, length))
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
468cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        // Update the data to contain the entire file if it doesn't already
469cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        if (data_sp->GetByteSize() < length)
470cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        {
471cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton            data_sp = file->MemoryMapFileContents(file_offset, length);
472cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton            data_offset = 0;
473cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        }
474102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton        std::unique_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module_sp, data_sp, data_offset, file, file_offset, length));
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (objfile_ap.get() && objfile_ap->ParseHeader())
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return objfile_ap.release();
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
481b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile *
4829badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason MolendaObjectFileMachO::CreateMemoryInstance (const lldb::ModuleSP &module_sp,
4839badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                       DataBufferSP& data_sp,
4849badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                       const ProcessSP &process_sp,
485b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                       lldb::addr_t header_addr)
486b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
487b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (ObjectFileMachO::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
488b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
489102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton        std::unique_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module_sp, data_sp, process_sp, header_addr));
490b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (objfile_ap.get() && objfile_ap->ParseHeader())
491b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            return objfile_ap.release();
492b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
4939badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda    return NULL;
494b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
495b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
49636b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonsize_t
49736b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFileMachO::GetModuleSpecifications (const lldb_private::FileSpec& file,
49836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                          lldb::DataBufferSP& data_sp,
49936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                          lldb::offset_t data_offset,
50036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                          lldb::offset_t file_offset,
50136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                          lldb::offset_t length,
50236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                          lldb_private::ModuleSpecList &specs)
50336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{
50436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    const size_t initial_count = specs.GetSize();
50536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
50636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    if (ObjectFileMachO::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize()))
50736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
50836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        DataExtractor data;
50936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        data.SetData(data_sp);
51036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        llvm::MachO::mach_header header;
51136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        if (ParseHeader (data, &data_offset, header))
51236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        {
51336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            if (header.sizeofcmds >= data_sp->GetByteSize())
51436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            {
51536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                data_sp = file.ReadFileContents(file_offset, header.sizeofcmds);
5167980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton                data.SetData(data_sp);
5177980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton                data_offset = MachHeaderSizeFromMagic(header.magic);
51836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            }
51936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            if (data_sp)
52036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            {
52136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                ModuleSpec spec;
52236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                spec.GetFileSpec() = file;
52336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                spec.GetArchitecture().SetArchitecture(eArchTypeMachO,
52436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                                       header.cputype,
52536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                                                       header.cpusubtype);
52636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                if (spec.GetArchitecture().IsValid())
52736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                {
52836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    GetUUID (header, data, data_offset, spec.GetUUID());
52936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    specs.Append(spec);
53036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                }
53136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            }
53236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        }
53336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
53436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    return specs.GetSize() - initial_count;
53536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton}
53636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
53736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
538b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
539b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
540b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameTEXT()
541b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
542b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_segment_name_TEXT ("__TEXT");
543b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_segment_name_TEXT;
544b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
545b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
546b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
547b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameDATA()
548b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
549b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_segment_name_DATA ("__DATA");
550b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_segment_name_DATA;
551b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
552b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
553b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
554b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameOBJC()
555b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
556b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_segment_name_OBJC ("__OBJC");
557b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_segment_name_OBJC;
558b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
559b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
560b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
561b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSegmentNameLINKEDIT()
562b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
563b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_section_name_LINKEDIT ("__LINKEDIT");
564b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_section_name_LINKEDIT;
565b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
566b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
567b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonconst ConstString &
568b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetSectionNameEHFrame()
569b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
570b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    static ConstString g_section_name_eh_frame ("__eh_frame");
571b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return g_section_name_eh_frame;
572b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
573b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
5759badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason MolendaObjectFileMachO::MagicBytesMatch (DataBufferSP& data_sp,
5769badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                  lldb::addr_t data_offset,
577db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                                  lldb::addr_t data_length)
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
579db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    DataExtractor data;
580db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    data.SetData (data_sp, data_offset, data_length);
58136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t offset = 0;
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t magic = data.GetU32(&offset);
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return MachHeaderSizeFromMagic(magic) != 0;
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
587cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFileMachO::ObjectFileMachO(const lldb::ModuleSP &module_sp,
588cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 DataBufferSP& data_sp,
589cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 lldb::offset_t data_offset,
590cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 const FileSpec* file,
591cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 lldb::offset_t file_offset,
592cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                 lldb::offset_t length) :
593cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton    ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
59446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_segments(),
59546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_sections(),
59646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_entry_point_address(),
59746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets(),
59846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets_valid(false)
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
600ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton    ::memset (&m_header, 0, sizeof(m_header));
601ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton    ::memset (&m_dysymtab, 0, sizeof(m_dysymtab));
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6043508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileMachO::ObjectFileMachO (const lldb::ModuleSP &module_sp,
605b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                  lldb::DataBufferSP& header_data_sp,
606b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                  const lldb::ProcessSP &process_sp,
607b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                  lldb::addr_t header_addr) :
6083508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
60946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_segments(),
61046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_mach_sections(),
61146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_entry_point_address(),
61246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets(),
61346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_context_offsets_valid(false)
614b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
615b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ::memset (&m_header, 0, sizeof(m_header));
616b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ::memset (&m_dysymtab, 0, sizeof(m_dysymtab));
617b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::~ObjectFileMachO()
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62336b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonbool
62436b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFileMachO::ParseHeader (DataExtractor &data,
62536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                              lldb::offset_t *data_offset_ptr,
62636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                              llvm::MachO::mach_header &header)
62736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{
62836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    data.SetByteOrder (lldb::endian::InlHostByteOrder());
62936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    // Leave magic in the original byte order
63036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    header.magic = data.GetU32(data_offset_ptr);
63136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    bool can_parse = false;
63236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    bool is_64_bit = false;
63336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    switch (header.magic)
63436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
63536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        case HeaderMagic32:
63636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetByteOrder (lldb::endian::InlHostByteOrder());
63736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetAddressByteSize(4);
63836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            can_parse = true;
63936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            break;
64036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
64136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        case HeaderMagic64:
64236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetByteOrder (lldb::endian::InlHostByteOrder());
64336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetAddressByteSize(8);
64436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            can_parse = true;
64536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            is_64_bit = true;
64636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            break;
64736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
64836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        case HeaderMagic32Swapped:
64936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
65036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetAddressByteSize(4);
65136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            can_parse = true;
65236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            break;
65336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
65436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        case HeaderMagic64Swapped:
65536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
65636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            data.SetAddressByteSize(8);
65736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            is_64_bit = true;
65836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            can_parse = true;
65936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            break;
66036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
66136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        default:
66236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            break;
66336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
66436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
66536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    if (can_parse)
66636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
66736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        data.GetU32(data_offset_ptr, &header.cputype, 6);
66836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        if (is_64_bit)
66936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            *data_offset_ptr += 4;
67036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        return true;
67136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
67236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    else
67336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
67436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        memset(&header, 0, sizeof(header));
67536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
67636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    return false;
67736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton}
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::ParseHeader ()
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
6839482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
6869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        bool can_parse = false;
68736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
688cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton        m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
6899482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // Leave magic in the original byte order
6909482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        m_header.magic = m_data.GetU32(&offset);
6919482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        switch (m_header.magic)
6929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
6939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic32:
6949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
6959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(4);
6969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
6979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic64:
7009482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder (lldb::endian::InlHostByteOrder());
7019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(8);
7029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
7039482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic32Swapped:
7069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
7079482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(4);
7089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
7099482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7119482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        case HeaderMagic64Swapped:
7129482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig);
7139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.SetAddressByteSize(8);
7149482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            can_parse = true;
7159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        default:
7189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            break;
7199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (can_parse)
722b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
7239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_data.GetU32(&offset, &m_header.cputype, 6);
7249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
7259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ArchSpec mach_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
7269badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
72721a2543251940af5592c7c72dac895148fc609e0Greg Clayton            // Check if the module has a required architecture
72821a2543251940af5592c7c72dac895148fc609e0Greg Clayton            const ArchSpec &module_arch = module_sp->GetArchitecture();
72940e278caddf5442776f9408f20d757cc85fe630aSean Callanan            if (module_arch.IsValid() && !module_arch.IsCompatibleMatch(mach_arch))
73021a2543251940af5592c7c72dac895148fc609e0Greg Clayton                return false;
73121a2543251940af5592c7c72dac895148fc609e0Greg Clayton
7329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (SetModulesArchitecture (mach_arch))
733b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
7349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const size_t header_and_lc_size = m_header.sizeofcmds + MachHeaderSizeFromMagic(m_header.magic);
7359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (m_data.GetByteSize() < header_and_lc_size)
736b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                {
7379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    DataBufferSP data_sp;
7389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    ProcessSP process_sp (m_process_wp.lock());
7399482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (process_sp)
7409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
741cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                        data_sp = ReadMemory (process_sp, m_memory_addr, header_and_lc_size);
7429482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
7439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    else
7449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
7459482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // Read in all only the load command data from the file on disk
746cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                        data_sp = m_file.ReadFileContents(m_file_offset, header_and_lc_size);
7479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (data_sp->GetByteSize() != header_and_lc_size)
7489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            return false;
7499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
7509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (data_sp)
7519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        m_data.SetData (data_sp);
752b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                }
753b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
7549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            return true;
7559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
7569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        else
7579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
7589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            memset(&m_header, 0, sizeof(struct mach_header));
759b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerByteOrder
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetByteOrder () const
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.GetByteOrder ();
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
7727508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFileMachO::IsExecutable() const
7737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
7747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return m_header.filetype == HeaderFileTypeExecutable;
7757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonuint32_t
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetAddressByteSize () const
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.GetAddressByteSize ();
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
783b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressClass
784b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonObjectFileMachO::GetAddressClass (lldb::addr_t file_addr)
785b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
786b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Symtab *symtab = GetSymtab();
787b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (symtab)
788b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
789b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
790b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (symbol)
791b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
7920c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton            if (symbol->ValueIsAddress())
793b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
7940c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton                SectionSP section_sp (symbol->GetAddress().GetSection());
7953508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                if (section_sp)
796b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
7973508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    const SectionType section_type = section_sp->GetType();
798b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    switch (section_type)
799b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
800b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeInvalid:               return eAddressClassUnknown;
801b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeCode:
802b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        if (m_header.cputype == llvm::MachO::CPUTypeARM)
803b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        {
804b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            // For ARM we have a bit in the n_desc field of the symbol
805b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            // that tells us ARM/Thumb which is bit 0x0008.
806b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
807b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                return eAddressClassCodeAlternateISA;
808b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        }
809b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return eAddressClassCode;
810b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
811b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeContainer:             return eAddressClassUnknown;
81224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData:
81324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCString:
81424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCStringPointers:
81524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataSymbolAddress:
81624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData4:
81724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData8:
81824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData16:
81924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataPointers:
82024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeZeroFill:
82124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCMessageRefs:
82224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCCFStrings:
82324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassData;
82424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDebug:
82524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAbbrev:
82624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAranges:
82724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugFrame:
82824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugInfo:
82924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLine:
83024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLoc:
83124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugMacInfo:
83224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubNames:
83324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubTypes:
83424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugRanges:
83524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugStr:
83624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNames:
83724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleTypes:
83824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNamespaces:
83924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleObjC:
84024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassDebug;
841b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeEHFrame:               return eAddressClassRuntime;
842a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    case eSectionTypeELFSymbolTable:
843a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    case eSectionTypeELFDynamicSymbols:
844a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    case eSectionTypeELFRelocationEntries:
845a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    case eSectionTypeELFDynamicLinkInfo:
846b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeOther:                 return eAddressClassUnknown;
847b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
848b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
849b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
8509badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
851b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const SymbolType symbol_type = symbol->GetType();
852b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            switch (symbol_type)
853b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
854b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAny:            return eAddressClassUnknown;
855b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAbsolute:       return eAddressClassUnknown;
8569badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
857b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCode:
858b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeTrampoline:
8590688435f443de94c82a1ec3b33451beaf2f0b43dGreg Clayton            case eSymbolTypeResolver:
860b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (m_header.cputype == llvm::MachO::CPUTypeARM)
861b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
862b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    // For ARM we have a bit in the n_desc field of the symbol
863b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    // that tells us ARM/Thumb which is bit 0x0008.
864b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB)
865b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return eAddressClassCodeAlternateISA;
866b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
867b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return eAddressClassCode;
868b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
869b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeData:           return eAddressClassData;
870b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeRuntime:        return eAddressClassRuntime;
871b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeException:      return eAddressClassRuntime;
872b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeSourceFile:     return eAddressClassDebug;
873b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeHeaderFile:     return eAddressClassDebug;
874b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeObjectFile:     return eAddressClassDebug;
875b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCommonBlock:    return eAddressClassDebug;
876b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeBlock:          return eAddressClassDebug;
877b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLocal:          return eAddressClassData;
878b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeParam:          return eAddressClassData;
879b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariable:       return eAddressClassData;
880b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariableType:   return eAddressClassDebug;
881b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineEntry:      return eAddressClassDebug;
882b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineHeader:     return eAddressClassDebug;
883b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeBegin:     return eAddressClassDebug;
884b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeEnd:       return eAddressClassDebug;
885b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAdditional:     return eAddressClassUnknown;
886b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCompiler:       return eAddressClassDebug;
887b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeInstrumentation:return eAddressClassDebug;
888b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeUndefined:      return eAddressClassUnknown;
8893f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCClass:      return eAddressClassRuntime;
8903f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCMetaClass:  return eAddressClassRuntime;
8913f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCIVar:       return eAddressClassRuntime;
892b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
893b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
894b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
895b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return eAddressClassUnknown;
896b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymtab *
8997940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileMachO::GetSymtab()
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
9029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
9059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_symtab_ap.get() == NULL)
9069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
9079482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap.reset(new Symtab(this));
9089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            Mutex::Locker symtab_locker (m_symtab_ap->GetMutex());
9097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            ParseSymtab ();
9109482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap->Finalize ();
9119482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symtab_ap.get();
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonbool
9177940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileMachO::IsStripped ()
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    if (m_dysymtab.cmd == 0)
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9217940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        ModuleSP module_sp(GetModule());
9227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        if (module_sp)
9239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
9247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
9257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            for (uint32_t i=0; i<m_header.ncmds; ++i)
9267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            {
9277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                const lldb::offset_t load_cmd_offset = offset;
9287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
9297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                load_command lc;
9307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                if (m_data.GetU32(&offset, &lc.cmd, 2) == NULL)
9317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    break;
9327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                if (lc.cmd == LoadCommandDynamicSymtabInfo)
9337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                {
9347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    m_dysymtab.cmd = lc.cmd;
9357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    m_dysymtab.cmdsize = lc.cmdsize;
9367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    if (m_data.GetU32 (&offset, &m_dysymtab.ilocalsym, (sizeof(m_dysymtab) / sizeof(uint32_t)) - 2) == NULL)
9377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    {
9387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // Clear m_dysymtab if we were unable to read all items from the load command
9397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        ::memset (&m_dysymtab, 0, sizeof(m_dysymtab));
9407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    }
9417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                }
9427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                offset = load_cmd_offset + lc.cmdsize;
9437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            }
9449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    if (m_dysymtab.cmd)
9477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        return m_dysymtab.nlocalsym == 0;
9487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    return false;
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonvoid
9527940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileMachO::CreateSections (SectionList &unified_section_list)
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    if (!m_sections_ap.get())
9556f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton    {
9567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        m_sections_ap.reset(new SectionList());
9577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
9587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        const bool is_dsym = (m_header.filetype == HeaderFileTypeDSYM);
9597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        lldb::user_id_t segID = 0;
9607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        lldb::user_id_t sectID = 0;
9617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
9627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        uint32_t i;
9637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        const bool is_core = GetType() == eTypeCoreFile;
9647940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        //bool dump_sections = false;
9657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        ModuleSP module_sp (GetModule());
9667940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        // First look up any LC_ENCRYPTION_INFO load commands
9677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        typedef RangeArray<uint32_t, uint32_t, 8> EncryptedFileRanges;
9687940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        EncryptedFileRanges encrypted_file_ranges;
9697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        encryption_info_command encryption_cmd;
9707940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
9716f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton        {
9727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            const lldb::offset_t load_cmd_offset = offset;
9737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            if (m_data.GetU32(&offset, &encryption_cmd, 2) == NULL)
9747940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                break;
9757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
9767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            if (encryption_cmd.cmd == LoadCommandEncryptionInfo)
97754e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton            {
9787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                if (m_data.GetU32(&offset, &encryption_cmd.cryptoff, 3))
97954e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                {
9807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    if (encryption_cmd.cryptid != 0)
9817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    {
9827940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        EncryptedFileRanges::Entry entry;
9837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        entry.SetRangeBase(encryption_cmd.cryptoff);
9847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        entry.SetByteSize(encryption_cmd.cryptsize);
9857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        encrypted_file_ranges.Append(entry);
9867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    }
98754e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton                }
98854e3371c9260525efa58a87ce2e0c6dcaf0ba2cfGreg Clayton            }
9897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            offset = load_cmd_offset + encryption_cmd.cmdsize;
9906f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton        }
9916f7f8daf508b225f0e1327f90237fd79912ca309Greg Clayton
9927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        offset = MachHeaderSizeFromMagic(m_header.magic);
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        struct segment_command_64 load_cmd;
9957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            const lldb::offset_t load_cmd_offset = offset;
9987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
9997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                break;
10007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
10017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            if (load_cmd.cmd == LoadCommandSegment32 || load_cmd.cmd == LoadCommandSegment64)
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
10037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                if (m_data.GetU8(&offset, (uint8_t*)load_cmd.segname, 16))
1004adf9e3db9be8f32e7eda7d4bb5b3b8f4d59ce46dJason Molenda                {
10057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    bool add_section = true;
10067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    bool add_to_unified = true;
10077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    ConstString const_segname (load_cmd.segname, std::min<size_t>(strlen(load_cmd.segname), sizeof(load_cmd.segname)));
10087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
10097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    SectionSP unified_section_sp(unified_section_list.FindSectionByName(const_segname));
10107940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    if (is_dsym && unified_section_sp)
1011bb75986fc654232256e544edb1cf8a90a273d4a6Greg Clayton                    {
10127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (const_segname == GetSegmentNameLINKEDIT())
10137940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
10147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // We need to keep the __LINKEDIT segment private to this object file only
10157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            add_to_unified = false;
10167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
10177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        else
10187940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
10197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // This is the dSYM file and this section has already been created by
10207940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // the object file, no need to create it.
10217940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            add_section = false;
10227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
1023bb75986fc654232256e544edb1cf8a90a273d4a6Greg Clayton                    }
10247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    load_cmd.vmaddr = m_data.GetAddress(&offset);
10257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    load_cmd.vmsize = m_data.GetAddress(&offset);
10267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    load_cmd.fileoff = m_data.GetAddress(&offset);
10277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    load_cmd.filesize = m_data.GetAddress(&offset);
10287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    if (m_length != 0 && load_cmd.filesize != 0)
1029adf9e3db9be8f32e7eda7d4bb5b3b8f4d59ce46dJason Molenda                    {
10307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (load_cmd.fileoff > m_length)
10317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
10327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // We have a load command that says it extends past the end of hte file.  This is likely
10337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // a corrupt file.  We don't have any way to return an error condition here (this method
10347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // was likely invokved from something like ObjectFile::GetSectionList()) -- all we can do
10357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // is null out the SectionList vector and if a process has been set up, dump a message
10367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // to stdout.  The most common case here is core file debugging with a truncated file.
10377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            const char *lc_segment_name = load_cmd.cmd == LoadCommandSegment64 ? "LC_SEGMENT_64" : "LC_SEGMENT";
10387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            GetModule()->ReportError("is a corrupt mach-o file: load command %u %s has a fileoff (0x%" PRIx64 ") that extends beyond the end of the file (0x%" PRIx64 ")",
10397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     i,
10407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     lc_segment_name,
10417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     load_cmd.fileoff,
10427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     m_length);
10437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
10447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            load_cmd.fileoff = 0;
10457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            load_cmd.filesize = 0;
10467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
10477c6bda45b0ad0cb4105da2aa676cecc32c0a7074Greg Clayton
10487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (load_cmd.fileoff + load_cmd.filesize > m_length)
10497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
10507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // We have a load command that says it extends past the end of hte file.  This is likely
10517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // a corrupt file.  We don't have any way to return an error condition here (this method
10527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // was likely invokved from something like ObjectFile::GetSectionList()) -- all we can do
10537940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // is null out the SectionList vector and if a process has been set up, dump a message
10547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // to stdout.  The most common case here is core file debugging with a truncated file.
10557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            const char *lc_segment_name = load_cmd.cmd == LoadCommandSegment64 ? "LC_SEGMENT_64" : "LC_SEGMENT";
10567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            GetModule()->ReportError("is a corrupt mach-o file: load command %u %s has a fileoff + filesize (0x%" PRIx64 ") that extends beyond the end of the file (0x%" PRIx64 "), the segment will be truncated",
10577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     i,
10587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     lc_segment_name,
10597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     load_cmd.fileoff + load_cmd.filesize,
10607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                     m_length);
10617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
10627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // Tuncase the length
10637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            load_cmd.filesize = m_length - load_cmd.fileoff;
10647940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
1065adf9e3db9be8f32e7eda7d4bb5b3b8f4d59ce46dJason Molenda                    }
10667940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    if (m_data.GetU32(&offset, &load_cmd.maxprot, 4))
10677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    {
10689badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
10697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        const bool segment_is_encrypted = (load_cmd.flags & SegmentCommandFlagBitProtectedVersion1) != 0;
107068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
10717940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // Keep a list of mach segments around in case we need to
10727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // get at data that isn't stored in the abstracted Sections.
10737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        m_mach_segments.push_back (load_cmd);
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // Use a segment ID of the segment index shifted left by 8 so they
10767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // never conflict with any of the sections.
10777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        SectionSP segment_sp;
10787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (add_section && (const_segname || is_core))
10797940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
10807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            segment_sp.reset(new Section (module_sp,              // Module to which this section belongs
10817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          this,                   // Object file to which this sections belongs
10827940069905bee0b2e5f0661bf37c9f906ddf8603Greg 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
10837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          const_segname,          // Name of this section
10847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          eSectionTypeContainer,  // This section is a container of other sections.
10857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          load_cmd.vmaddr,        // File VM address == addresses as they are found in the object file
10867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          load_cmd.vmsize,        // VM size in bytes of this section
10877940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          load_cmd.fileoff,       // Offset to the data for this section in the file
10887940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          load_cmd.filesize,      // Size in bytes of this section as found in the the file
10897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                          load_cmd.flags));       // Flags for this section
10907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
10917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            segment_sp->SetIsEncrypted (segment_is_encrypted);
10927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            m_sections_ap->AddSection(segment_sp);
10937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (add_to_unified)
10947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                unified_section_list.AddSection(segment_sp);
10957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
10967940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        else if (unified_section_sp)
10977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
10987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            m_sections_ap->AddSection(unified_section_sp);
10997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        struct section_64 sect64;
11027940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        ::memset (&sect64, 0, sizeof(sect64));
11037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // Push a section into our mach sections for the section at
11047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // index zero (NListSectionNoSection) if we don't have any
11057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        // mach sections yet...
11067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (m_mach_sections.empty())
11077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            m_mach_sections.push_back(sect64);
11087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        uint32_t segment_sect_idx;
11097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        const lldb::user_id_t first_segment_sectID = sectID + 1;
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        const uint32_t num_u32s = load_cmd.cmd == LoadCommandSegment32 ? 7 : 8;
11137940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        for (segment_sect_idx=0; segment_sect_idx<load_cmd.nsects; ++segment_sect_idx)
11147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
11157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (m_data.GetU8(&offset, (uint8_t*)sect64.sectname, sizeof(sect64.sectname)) == NULL)
11167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                break;
11177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (m_data.GetU8(&offset, (uint8_t*)sect64.segname, sizeof(sect64.segname)) == NULL)
11187940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                break;
11197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            sect64.addr = m_data.GetAddress(&offset);
11207940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            sect64.size = m_data.GetAddress(&offset);
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (m_data.GetU32(&offset, &sect64.offset, num_u32s) == NULL)
11237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                break;
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // Keep a list of mach sections around in case we need to
11267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            // get at data that isn't stored in the abstracted Sections.
11277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            m_mach_sections.push_back (sect64);
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (add_section)
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
11317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                ConstString section_name (sect64.sectname, std::min<size_t>(strlen(sect64.sectname), sizeof(sect64.sectname)));
11327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                if (!const_segname)
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
11347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // We have a segment with no name so we need to conjure up
11357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // segments that correspond to the section's segname if there
11367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // isn't already such a section. If there is such a section,
11377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // we resize the section so that it spans all sections.
11387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // We also mark these sections as fake so address matches don't
11397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // hit if they land in the gaps between the child sections.
11407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    const_segname.SetTrimmedCStringWithLength(sect64.segname, sizeof(sect64.segname));
11417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    segment_sp = unified_section_list.FindSectionByName (const_segname);
11427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    if (segment_sp.get())
11437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    {
11447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        Section *segment = segment_sp.get();
11457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        // Grow the section size as needed.
11467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        const lldb::addr_t sect64_min_addr = sect64.addr;
11477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        const lldb::addr_t sect64_max_addr = sect64_min_addr + sect64.size;
11487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        const lldb::addr_t curr_seg_byte_size = segment->GetByteSize();
11497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        const lldb::addr_t curr_seg_min_addr = segment->GetFileAddress();
11507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        const lldb::addr_t curr_seg_max_addr = curr_seg_min_addr + curr_seg_byte_size;
11517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        if (sect64_min_addr >= curr_seg_min_addr)
11527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        {
11537940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t new_seg_byte_size = sect64_max_addr - curr_seg_min_addr;
11547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            // Only grow the section size if needed
11557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            if (new_seg_byte_size > curr_seg_byte_size)
11567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                segment->SetByteSize (new_seg_byte_size);
11577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        }
11587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        else
11597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        {
11607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            // We need to change the base address of the segment and
11617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            // adjust the child section offsets for all existing children.
11627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t slide_amount = sect64_min_addr - curr_seg_min_addr;
11637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            segment->Slide(slide_amount, false);
11647940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            segment->GetChildren().Slide(-slide_amount, false);
11657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            segment->SetByteSize (curr_seg_max_addr - sect64_min_addr);
11667940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        }
11677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
11687940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        // Grow the section size as needed.
11697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        if (sect64.offset)
11707940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        {
11717940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t segment_min_file_offset = segment->GetFileOffset();
11727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t segment_max_file_offset = segment_min_file_offset + segment->GetFileSize();
11737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
11747940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t section_min_file_offset = sect64.offset;
11757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t section_max_file_offset = section_min_file_offset + sect64.size;
11767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t new_file_offset = std::min (section_min_file_offset, segment_min_file_offset);
11777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            const lldb::addr_t new_file_size = std::max (section_max_file_offset, segment_max_file_offset) - new_file_offset;
11787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            segment->SetFileOffset (new_file_offset);
11797940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            segment->SetFileSize (new_file_size);
11807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        }
11817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    }
11827940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    else
11837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    {
11847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        // Create a fake section for the section's named segment
11857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        segment_sp.reset(new Section (segment_sp,            // Parent section
11867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      module_sp,             // Module to which this section belongs
11877940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      this,                  // Object file to which this section belongs
11887940069905bee0b2e5f0661bf37c9f906ddf8603Greg 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
11897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      const_segname,         // Name of this section
11907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      eSectionTypeContainer, // This section is a container of other sections.
11917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      sect64.addr,           // File VM address == addresses as they are found in the object file
11927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      sect64.size,           // VM size in bytes of this section
11937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      sect64.offset,         // Offset to the data for this section in the file
11947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      sect64.offset ? sect64.size : 0,        // Size in bytes of this section as found in the the file
11957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                      load_cmd.flags));      // Flags for this section
11967940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        segment_sp->SetIsFake(true);
11977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
11987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        m_sections_ap->AddSection(segment_sp);
11997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        if (add_to_unified)
12007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            unified_section_list.AddSection(segment_sp);
12017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        segment_sp->SetIsEncrypted (segment_is_encrypted);
12027940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    }
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
12047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                assert (segment_sp.get());
12057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
12067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                uint32_t mach_sect_type = sect64.flags & SectionFlagMaskSectionType;
12077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_data ("__objc_data");
12087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_msgrefs ("__objc_msgrefs");
12097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_selrefs ("__objc_selrefs");
12107940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_classrefs ("__objc_classrefs");
12117940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_superrefs ("__objc_superrefs");
12127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_const ("__objc_const");
12137940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_objc_classlist ("__objc_classlist");
12147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_cfstring ("__cfstring");
12157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
12167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_abbrev ("__debug_abbrev");
12177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_aranges ("__debug_aranges");
12187940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_frame ("__debug_frame");
12197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_info ("__debug_info");
12207940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_line ("__debug_line");
12217940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_loc ("__debug_loc");
12227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_macinfo ("__debug_macinfo");
12237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_pubnames ("__debug_pubnames");
12247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_pubtypes ("__debug_pubtypes");
12257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_ranges ("__debug_ranges");
12267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_debug_str ("__debug_str");
12277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_apple_names ("__apple_names");
12287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_apple_types ("__apple_types");
12297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_apple_namespaces ("__apple_namespac");
12307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_dwarf_apple_objc ("__apple_objc");
12317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_eh_frame ("__eh_frame");
12327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_DATA ("__DATA");
12337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                static ConstString g_sect_name_TEXT ("__TEXT");
12347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
12357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                SectionType sect_type = eSectionTypeOther;
12367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
12377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                if (section_name == g_sect_name_dwarf_debug_abbrev)
12387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugAbbrev;
12397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_aranges)
12407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugAranges;
12417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_frame)
12427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugFrame;
12437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_info)
12447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugInfo;
12457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_line)
12467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugLine;
12477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_loc)
12487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugLoc;
12497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_macinfo)
12507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugMacInfo;
12517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_pubnames)
12527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugPubNames;
12537940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_pubtypes)
12547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugPubTypes;
12557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_ranges)
12567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugRanges;
12577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_debug_str)
12587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFDebugStr;
12597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_apple_names)
12607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFAppleNames;
12617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_apple_types)
12627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFAppleTypes;
12637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_apple_namespaces)
12647940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFAppleNamespaces;
12657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_dwarf_apple_objc)
12667940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDWARFAppleObjC;
12677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_objc_selrefs)
12687940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDataCStringPointers;
12697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_objc_msgrefs)
12707940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDataObjCMessageRefs;
12717940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_eh_frame)
12727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeEHFrame;
12737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_cfstring)
12747940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDataObjCCFStrings;
12757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                else if (section_name == g_sect_name_objc_data ||
12767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                         section_name == g_sect_name_objc_classrefs ||
12777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                         section_name == g_sect_name_objc_superrefs ||
12787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                         section_name == g_sect_name_objc_const ||
12797940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                         section_name == g_sect_name_objc_classlist)
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
12817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    sect_type = eSectionTypeDataPointers;
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
1283661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton
12847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                if (sect_type == eSectionTypeOther)
1285661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                {
12867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    switch (mach_sect_type)
12877940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    {
12887940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    // TODO: categorize sections by other flags for regular sections
12897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeRegular:
12907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        if (segment_sp->GetName() == g_sect_name_TEXT)
12917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            sect_type = eSectionTypeCode;
12927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        else if (segment_sp->GetName() == g_sect_name_DATA)
12937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            sect_type = eSectionTypeData;
12947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        else
12957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            sect_type = eSectionTypeOther;
12967940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        break;
12977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeZeroFill:                   sect_type = eSectionTypeZeroFill; break;
12987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeCStringLiterals:            sect_type = eSectionTypeDataCString;    break; // section with only literal C strings
12997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionType4ByteLiterals:              sect_type = eSectionTypeData4;    break; // section with only 4 byte literals
13007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionType8ByteLiterals:              sect_type = eSectionTypeData8;    break; // section with only 8 byte literals
13017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeLiteralPointers:            sect_type = eSectionTypeDataPointers;  break; // section with only pointers to literals
13027940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeNonLazySymbolPointers:      sect_type = eSectionTypeDataPointers;  break; // section with only non-lazy symbol pointers
13037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeLazySymbolPointers:         sect_type = eSectionTypeDataPointers;  break; // section with only lazy symbol pointers
13047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeSymbolStubs:                sect_type = eSectionTypeCode;  break; // section with only symbol stubs, byte size of stub in the reserved2 field
13057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeModuleInitFunctionPointers: sect_type = eSectionTypeDataPointers;    break; // section with only function pointers for initialization
13067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeModuleTermFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for termination
13077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeCoalesced:                  sect_type = eSectionTypeOther; break;
13087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeZeroFillLarge:              sect_type = eSectionTypeZeroFill; break;
13097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeInterposing:                sect_type = eSectionTypeCode;  break; // section with only pairs of function pointers for interposing
13107940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionType16ByteLiterals:             sect_type = eSectionTypeData16; break; // section with only 16 byte literals
13117940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeDTraceObjectFormat:         sect_type = eSectionTypeDebug; break;
13127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    case SectionTypeLazyDylibSymbolPointers:    sect_type = eSectionTypeDataPointers;  break;
13137940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    default: break;
13147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    }
1315661825b68e95abdfab2c7242c0d515e8260d1431Greg Clayton                                }
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                SectionSP section_sp(new Section (segment_sp,
13187940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  module_sp,
13197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  this,
13207940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  ++sectID,
13217940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  section_name,
13227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  sect_type,
13237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  sect64.addr - segment_sp->GetFileAddress(),
13247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  sect64.size,
13257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  sect64.offset,
13267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  sect64.offset == 0 ? 0 : sect64.size,
13277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                  sect64.flags));
13287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                // Set the section to be encrypted to match the segment
13297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
13307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                bool section_is_encrypted = false;
13317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                if (!segment_is_encrypted && load_cmd.filesize != 0)
13327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    section_is_encrypted = encrypted_file_ranges.FindEntryThatContains(sect64.offset) != NULL;
13337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
13347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                section_sp->SetIsEncrypted (segment_is_encrypted || section_is_encrypted);
13357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                segment_sp->GetChildren().AddSection(section_sp);
13367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
13377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                if (segment_sp->IsFake())
13387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                {
13397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    segment_sp.reset();
13407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    const_segname.Clear();
13417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                }
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
13447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (segment_sp && is_dsym)
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
13467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (first_segment_sectID <= sectID)
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
13487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                lldb::user_id_t sect_uid;
13497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                for (sect_uid = first_segment_sectID; sect_uid <= sectID; ++sect_uid)
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
13517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    SectionSP curr_section_sp(segment_sp->GetChildren().FindSectionByID (sect_uid));
13527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    SectionSP next_section_sp;
13537940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    if (sect_uid + 1 <= sectID)
13547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        next_section_sp = segment_sp->GetChildren().FindSectionByID (sect_uid+1);
13557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
13567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                    if (curr_section_sp.get())
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
13587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        if (curr_section_sp->GetByteSize() == 0)
13597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        {
13607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            if (next_section_sp.get() != NULL)
13617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                curr_section_sp->SetByteSize ( next_section_sp->GetFileAddress() - curr_section_sp->GetFileAddress() );
13627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                            else
13637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                curr_section_sp->SetByteSize ( load_cmd.vmsize );
13647940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                        }
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
13727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            else if (load_cmd.cmd == LoadCommandDynamicSymtabInfo)
13737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            {
13747940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                m_dysymtab.cmd = load_cmd.cmd;
13757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                m_dysymtab.cmdsize = load_cmd.cmdsize;
13767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                m_data.GetU32 (&offset, &m_dysymtab.ilocalsym, (sizeof(m_dysymtab) / sizeof(uint32_t)) - 2);
13777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            }
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13797940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            offset = load_cmd_offset + load_cmd.cmdsize;
13807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        }
13817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
13827940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        StreamFile s(stdout, false);                    // REMOVE THIS LINE
13837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        s.Printf ("Sections for %s:\n", m_file.GetPath().c_str());// REMOVE THIS LINE
13847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        m_sections_ap->Dump(&s, NULL, true, UINT32_MAX);// REMOVE THIS LINE
138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachSymtabSectionInfo
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachSymtabSectionInfo (SectionList *section_list) :
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_section_list (section_list),
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_section_infos()
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get the number of sections down to a depth of 1 to include
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // all segments and their sections, but no other sections that
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // may be added for debug map or
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_section_infos.resize(section_list->GetNumSections(1));
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14033508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSection (uint8_t n_sect, addr_t file_addr)
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (n_sect == 0)
14073508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            return SectionSP();
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (n_sect < m_section_infos.size())
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14103508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            if (!m_section_infos[n_sect].section_sp)
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                SectionSP section_sp (m_section_list->FindSectionByID (n_sect));
14133508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                m_section_infos[n_sect].section_sp = section_sp;
1414b386d82334b65fb984348f2027b1cb7714de993fSean Callanan                if (section_sp)
14155638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                {
14163508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    m_section_infos[n_sect].vm_range.SetBaseAddress (section_sp->GetFileAddress());
14173508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    m_section_infos[n_sect].vm_range.SetByteSize (section_sp->GetByteSize());
14185638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                }
14195638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                else
14205638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                {
1421df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                    Host::SystemLog (Host::eSystemLogError, "error: unable to find section for section %u\n", n_sect);
14225638d2c0d72747d8334638a128a17246353b53a7Greg Clayton                }
142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_section_infos[n_sect].vm_range.Contains(file_addr))
1425811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            {
1426811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // Symbol is in section.
14273508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                return m_section_infos[n_sect].section_sp;
1428811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            }
1429811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            else if (m_section_infos[n_sect].vm_range.GetByteSize () == 0 &&
1430811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                     m_section_infos[n_sect].vm_range.GetBaseAddress() == file_addr)
1431811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            {
1432811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // Symbol is in section with zero size, but has the same start
1433811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // address as the section. This can happen with linker symbols
1434811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                // (symbols that start with the letter 'l' or 'L'.
14353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                return m_section_infos[n_sect].section_sp;
1436811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton            }
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14383508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        return m_section_list->FindSectionContainingFileAddress(file_addr);
143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct SectionInfo
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SectionInfo () :
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            vm_range(),
14463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            section_sp ()
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        VMRange vm_range;
14513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        SectionSP section_sp;
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SectionList *m_section_list;
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<SectionInfo> m_section_infos;
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
14587940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileMachO::ParseSymtab ()
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "ObjectFileMachO::ParseSymtab () module = %s",
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       m_file.GetFilename().AsCString(""));
14634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    ModuleSP module_sp (GetModule());
14644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    if (!module_sp)
14654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        return 0;
14664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
14674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    struct symtab_command symtab_load_command = { 0, 0, 0, 0, 0, 0 };
14684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    struct linkedit_data_command function_starts_load_command = { 0, 0, 0, 0 };
14694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    typedef AddressDataArray<lldb::addr_t, bool, 100> FunctionStarts;
14704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    FunctionStarts function_starts;
147136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t i;
14734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
1474952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS));
14750fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (i=0; i<m_header.ncmds; ++i)
147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
147836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const lldb::offset_t cmd_offset = offset;
147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Read in the load command and load command size
14804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        struct load_command lc;
14814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (m_data.GetU32(&offset, &lc, 2) == NULL)
148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Watch for the symbol table load command
14844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        switch (lc.cmd)
148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        case LoadCommandSymtab:
14874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            symtab_load_command.cmd = lc.cmd;
14884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            symtab_load_command.cmdsize = lc.cmdsize;
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Read in the rest of the symtab load command
14904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (m_data.GetU32(&offset, &symtab_load_command.symoff, 4) == 0) // fill in symoff, nsyms, stroff, strsize fields
14914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
14924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.symoff == 0)
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
1495952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                    module_sp->LogMessage(log, "LC_SYMTAB.symoff == 0");
14964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
14974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
1498b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
14994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.stroff == 0)
15004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
15014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
1502952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                    module_sp->LogMessage(log, "LC_SYMTAB.stroff == 0");
15034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
15044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
15059badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
15064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.nsyms == 0)
15074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
15084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
1509952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                    module_sp->LogMessage(log, "LC_SYMTAB.nsyms == 0");
15104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
15114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
15129badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
15134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (symtab_load_command.strsize == 0)
15144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
15154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (log)
1516952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                    module_sp->LogMessage(log, "LC_SYMTAB.strsize == 0");
15174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                return 0;
15184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
15194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            break;
15200fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
15214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        case LoadCommandFunctionStarts:
15224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_starts_load_command.cmd = lc.cmd;
15234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_starts_load_command.cmdsize = lc.cmdsize;
15244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (m_data.GetU32(&offset, &function_starts_load_command.dataoff, 2) == NULL) // fill in symoff, nsyms, stroff, strsize fields
15254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                bzero (&function_starts_load_command, sizeof(function_starts_load_command));
15264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            break;
1527b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
15284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        default:
15294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            break;
15304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
15314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        offset = cmd_offset + lc.cmdsize;
15324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    }
1533b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
15344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    if (symtab_load_command.cmd)
15354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton    {
15364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        Symtab *symtab = m_symtab_ap.get();
15374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionList *section_list = GetSectionList();
15384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (section_list == NULL)
15394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            return 0;
1540b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
15414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        ProcessSP process_sp (m_process_wp.lock());
1542dd29b97f71187509df339596c3397dea0e429754Greg Clayton        Process *process = process_sp.get();
15430fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
154436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const uint32_t addr_byte_size = m_data.GetAddressByteSize();
154536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const ByteOrder byte_order = m_data.GetByteOrder();
15464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        bool bit_width_32 = addr_byte_size == 4;
15474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const size_t nlist_byte_size = bit_width_32 ? sizeof(struct nlist) : sizeof(struct nlist_64);
154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        DataExtractor nlist_data (NULL, 0, byte_order, addr_byte_size);
155036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        DataExtractor strtab_data (NULL, 0, byte_order, addr_byte_size);
155136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        DataExtractor function_starts_data (NULL, 0, byte_order, addr_byte_size);
15520bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda        DataExtractor indirect_symbol_index_data (NULL, 0, byte_order, addr_byte_size);
15539badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
15544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const addr_t nlist_data_byte_size = symtab_load_command.nsyms * nlist_byte_size;
15554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const addr_t strtab_data_byte_size = symtab_load_command.strsize;
1556dd29b97f71187509df339596c3397dea0e429754Greg Clayton        addr_t strtab_addr = LLDB_INVALID_ADDRESS;
1557dd29b97f71187509df339596c3397dea0e429754Greg Clayton        if (process)
15584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
1559dd29b97f71187509df339596c3397dea0e429754Greg Clayton            Target &target = process->GetTarget();
15604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            SectionSP linkedit_section_sp(section_list->FindSectionByName(GetSegmentNameLINKEDIT()));
15614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            // Reading mach file from memory in a process or core file...
15620fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton
15634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (linkedit_section_sp)
15644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
15654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                const addr_t linkedit_load_addr = linkedit_section_sp->GetLoadBaseAddress(&target);
15664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                const addr_t linkedit_file_offset = linkedit_section_sp->GetFileOffset();
15674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                const addr_t symoff_addr = linkedit_load_addr + symtab_load_command.symoff - linkedit_file_offset;
1568dd29b97f71187509df339596c3397dea0e429754Greg Clayton                strtab_addr = linkedit_load_addr + symtab_load_command.stroff - linkedit_file_offset;
156929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton
157029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                bool data_was_read = false;
157129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton
157229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#if defined (__APPLE__) && defined (__arm__)
157329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                if (m_header.flags & 0x80000000u)
15740fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton                {
157529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // This mach-o memory file is in the dyld shared cache. If this
157629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // program is not remote and this is iOS, then this process will
157729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // share the same shared cache as the process we are debugging and
157829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // we can read the entire __LINKEDIT from the address space in this
157929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // process. This is a needed optimization that is used for local iOS
158029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // debugging only since all shared libraries in the shared cache do
158129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // not have corresponding files that exist in the file system of the
158229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // device. They have been combined into a single file. This means we
158329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // always have to load these files from memory. All of the symbol and
158429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // string tables from all of the __LINKEDIT sections from the shared
158529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // libraries in the shared cache have been merged into a single large
158629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // symbol and string table. Reading all of this symbol and string table
158729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // data across can slow down debug launch times, so we optimize this by
158829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    // reading the memory for the __LINKEDIT section from this process.
158945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
159045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    UUID lldb_shared_cache(GetLLDBSharedCacheUUID());
159145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    UUID process_shared_cache(GetProcessSharedCacheUUID(process));
159245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    bool use_lldb_cache = true;
159345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    if (lldb_shared_cache.IsValid() && process_shared_cache.IsValid() && lldb_shared_cache != process_shared_cache)
159445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    {
159545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                            use_lldb_cache = false;
15966ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda                            ModuleSP module_sp (GetModule());
15976ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda                            if (module_sp)
15986ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda                                module_sp->ReportWarning ("shared cache in process does not match lldb's own shared cache, startup will be slow.");
15996ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda
160045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    }
160145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
160229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    PlatformSP platform_sp (target.GetPlatform());
160345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    if (platform_sp && platform_sp->IsHost() && use_lldb_cache)
160429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    {
160529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        data_was_read = true;
160629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        nlist_data.SetData((void *)symoff_addr, nlist_data_byte_size, eByteOrderLittle);
1607dd29b97f71187509df339596c3397dea0e429754Greg Clayton                        strtab_data.SetData((void *)strtab_addr, strtab_data_byte_size, eByteOrderLittle);
160829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        if (function_starts_load_command.cmd)
160929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        {
161029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                            const addr_t func_start_addr = linkedit_load_addr + function_starts_load_command.dataoff - linkedit_file_offset;
161129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                            function_starts_data.SetData ((void *)func_start_addr, function_starts_load_command.datasize, eByteOrderLittle);
161229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        }
161329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    }
161429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                }
161529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton#endif
161629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton
161729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                if (!data_was_read)
161829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                {
161929021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    DataBufferSP nlist_data_sp (ReadMemory (process_sp, symoff_addr, nlist_data_byte_size));
162029021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    if (nlist_data_sp)
162129021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        nlist_data.SetData (nlist_data_sp, 0, nlist_data_sp->GetByteSize());
1622dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    //DataBufferSP strtab_data_sp (ReadMemory (process_sp, strtab_addr, strtab_data_byte_size));
1623dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    //if (strtab_data_sp)
1624dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    //    strtab_data.SetData (strtab_data_sp, 0, strtab_data_sp->GetByteSize());
16250bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                    if (m_dysymtab.nindirectsyms != 0)
16260bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                    {
16270bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                        const addr_t indirect_syms_addr = linkedit_load_addr + m_dysymtab.indirectsymoff - linkedit_file_offset;
16280bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                        DataBufferSP indirect_syms_data_sp (ReadMemory (process_sp, indirect_syms_addr, m_dysymtab.nindirectsyms * 4));
16290bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                        if (indirect_syms_data_sp)
16300bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                            indirect_symbol_index_data.SetData (indirect_syms_data_sp, 0, indirect_syms_data_sp->GetByteSize());
16310bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                    }
163229021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    if (function_starts_load_command.cmd)
163329021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    {
163429021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        const addr_t func_start_addr = linkedit_load_addr + function_starts_load_command.dataoff - linkedit_file_offset;
163529021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        DataBufferSP func_start_data_sp (ReadMemory (process_sp, func_start_addr, function_starts_load_command.datasize));
163629021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                        if (func_start_data_sp)
163729021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                            function_starts_data.SetData (func_start_data_sp, 0, func_start_data_sp->GetByteSize());
163829021d341d8985ff180a0f1cdb0ce7a8504a83f6Greg Clayton                    }
16390fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton                }
16404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
16414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
16424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        else
16434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
16449badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda            nlist_data.SetData (m_data,
16459badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                symtab_load_command.symoff,
16464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                nlist_data_byte_size);
16474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            strtab_data.SetData (m_data,
16489badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                 symtab_load_command.stroff,
16494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                 strtab_data_byte_size);
16500bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda            if (m_dysymtab.nindirectsyms != 0)
16510bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda            {
16529badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                indirect_symbol_index_data.SetData (m_data,
16539badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                                    m_dysymtab.indirectsymoff,
16540bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda                                                    m_dysymtab.nindirectsyms * 4);
16550bf22380daa9ddbd8c0e8da81d3bc82c2601e5e6Jason Molenda            }
16564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (function_starts_load_command.cmd)
16574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
16584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                function_starts_data.SetData (m_data,
16594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                              function_starts_load_command.dataoff,
16604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                              function_starts_load_command.datasize);
16614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
16624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (nlist_data.GetByteSize() == 0)
16654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
16664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (log)
1667952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                module_sp->LogMessage(log, "failed to read nlist data");
16684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            return 0;
16694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1671a9c4f31f3c511a731fecdf09e8f032f4f537ebfaGreg Clayton
16723a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton        const bool have_strtab_data = strtab_data.GetByteSize() > 0;
16733a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton        if (!have_strtab_data)
1674dd29b97f71187509df339596c3397dea0e429754Greg Clayton        {
16753a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            if (process)
16763a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            {
16773a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                if (strtab_addr == LLDB_INVALID_ADDRESS)
16783a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                {
16793a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    if (log)
1680952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                        module_sp->LogMessage(log, "failed to locate the strtab in memory");
16813a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    return 0;
16823a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                }
16833a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            }
16843a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            else
1685dd29b97f71187509df339596c3397dea0e429754Greg Clayton            {
1686dd29b97f71187509df339596c3397dea0e429754Greg Clayton                if (log)
1687952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                    module_sp->LogMessage(log, "failed to read strtab data");
1688dd29b97f71187509df339596c3397dea0e429754Greg Clayton                return 0;
1689dd29b97f71187509df339596c3397dea0e429754Greg Clayton            }
1690dd29b97f71187509df339596c3397dea0e429754Greg Clayton        }
1691dd29b97f71187509df339596c3397dea0e429754Greg Clayton
16924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_segment_name_TEXT = GetSegmentNameTEXT();
16934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_segment_name_DATA = GetSegmentNameDATA();
16944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_segment_name_OBJC = GetSegmentNameOBJC();
16954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        const ConstString &g_section_name_eh_frame = GetSectionNameEHFrame();
16964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP text_section_sp(section_list->FindSectionByName(g_segment_name_TEXT));
16974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP data_section_sp(section_list->FindSectionByName(g_segment_name_DATA));
16984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP objc_section_sp(section_list->FindSectionByName(g_segment_name_OBJC));
16994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        SectionSP eh_frame_section_sp;
17004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (text_section_sp.get())
17014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            eh_frame_section_sp = text_section_sp->GetChildren().FindSectionByName (g_section_name_eh_frame);
17024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        else
17034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            eh_frame_section_sp = section_list->FindSectionByName (g_section_name_eh_frame);
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1705d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton        const bool is_arm = (m_header.cputype == llvm::MachO::CPUTypeARM);
1706d793839192c6351a1615cf723564ef672bd8b877Jason Molenda
1707d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        // lldb works best if it knows the start addresss of all functions in a module.
1708d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        // Linker symbols or debug info are normally the best source of information for start addr / size but
1709d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        // they may be stripped in a released binary.
17102120aef346c158f12ba72129796c6164a4981585Jason Molenda        // Two additional sources of information exist in Mach-O binaries:
1711d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        //    LC_FUNCTION_STARTS - a list of ULEB128 encoded offsets of each function's start address in the
1712d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        //                         binary, relative to the text section.
1713d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        //    eh_frame           - the eh_frame FDEs have the start addr & size of each function
1714d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        //  LC_FUNCTION_STARTS is the fastest source to read in, and is present on all modern binaries.
1715d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        //  Binaries built to run on older releases may need to use eh_frame information.
1716d793839192c6351a1615cf723564ef672bd8b877Jason Molenda
17174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (text_section_sp && function_starts_data.GetByteSize())
17184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
17194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            FunctionStarts::Entry function_start_entry;
17204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_start_entry.data = false;
172136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            lldb::offset_t function_start_offset = 0;
17224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            function_start_entry.addr = text_section_sp->GetFileAddress();
17234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            uint64_t delta;
17244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            while ((delta = function_starts_data.GetULEB128(&function_start_offset)) > 0)
17254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
17264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // Now append the current entry
17274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                function_start_entry.addr += delta;
17284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                function_starts.Append(function_start_entry);
17294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
17302120aef346c158f12ba72129796c6164a4981585Jason Molenda        }
1731d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        else
1732d793839192c6351a1615cf723564ef672bd8b877Jason Molenda        {
1733825a96a61c06c85eab4b07a7a018fdcc3d664009Jason Molenda            // If m_type is eTypeDebugInfo, then this is a dSYM - it will have the load command claiming an eh_frame
1734825a96a61c06c85eab4b07a7a018fdcc3d664009Jason Molenda            // but it doesn't actually have the eh_frame content.  And if we have a dSYM, we don't need to do any
1735825a96a61c06c85eab4b07a7a018fdcc3d664009Jason Molenda            // of this fill-in-the-missing-symbols works anyway - the debug info should give us all the functions in
1736825a96a61c06c85eab4b07a7a018fdcc3d664009Jason Molenda            // the module.
1737825a96a61c06c85eab4b07a7a018fdcc3d664009Jason Molenda            if (text_section_sp.get() && eh_frame_section_sp.get() && m_type != eTypeDebugInfo)
1738d793839192c6351a1615cf723564ef672bd8b877Jason Molenda            {
1739d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                DWARFCallFrameInfo eh_frame(*this, eh_frame_section_sp, eRegisterKindGCC, true);
1740d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                DWARFCallFrameInfo::FunctionAddressAndSizeVector functions;
1741d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                eh_frame.GetFunctionAddressAndSizeVector (functions);
1742d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                addr_t text_base_addr = text_section_sp->GetFileAddress();
1743d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                size_t count = functions.GetSize();
1744d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                for (size_t i = 0; i < count; ++i)
1745d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                {
1746d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                    const DWARFCallFrameInfo::FunctionAddressAndSizeVector::Entry *func = functions.GetEntryAtIndex (i);
1747d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                    if (func)
1748d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                    {
1749d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                        FunctionStarts::Entry function_start_entry;
1750d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                        function_start_entry.addr = func->base - text_base_addr;
1751d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                        function_starts.Append(function_start_entry);
1752d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                    }
1753d793839192c6351a1615cf723564ef672bd8b877Jason Molenda                }
1754d793839192c6351a1615cf723564ef672bd8b877Jason Molenda            }
17554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
17569badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
175736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const size_t function_starts_count = function_starts.GetSize();
17584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
175936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const user_id_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NListSectionNoSection;
17604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
176136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t nlist_data_offset = 0;
17624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
17634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t N_SO_index = UINT32_MAX;
17644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
17654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        MachSymtabSectionInfo section_info (section_list);
17664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_FUN_indexes;
17674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_NSYM_indexes;
17684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_INCL_indexes;
17694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_BRAC_indexes;
17704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        std::vector<uint32_t> N_COMM_indexes;
17714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        typedef std::map <uint64_t, uint32_t> ValueToSymbolIndexMap;
17724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        typedef std::map <uint32_t, uint32_t> NListIndexToSymbolIndexMap;
1773a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton        typedef std::map <const char *, uint32_t> ConstNameToSymbolIndexMap;
17744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        ValueToSymbolIndexMap N_FUN_addr_to_sym_idx;
17754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        ValueToSymbolIndexMap N_STSYM_addr_to_sym_idx;
1776a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton        ConstNameToSymbolIndexMap N_GSYM_name_to_sym_idx;
17774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // Any symbols that get merged into another will get an entry
17784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // in this map so we know
17794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        NListIndexToSymbolIndexMap m_nlist_idx_to_sym_idx;
17804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t nlist_idx = 0;
17814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        Symbol *symbol_ptr = NULL;
17824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
17834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t sym_idx = 0;
1784b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        Symbol *sym = NULL;
178536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t num_syms = 0;
1786dd29b97f71187509df339596c3397dea0e429754Greg Clayton        std::string memory_symbol_name;
1787b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        uint32_t unmapped_local_symbols_found = 0;
1788b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1789b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda#if defined (__APPLE__) && defined (__arm__)
1790b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1791b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // Some recent builds of the dyld_shared_cache (hereafter: DSC) have been optimized by moving LOCAL
1792b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // symbols out of the memory mapped portion of the DSC. The symbol information has all been retained,
1793b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // but it isn't available in the normal nlist data. However, there *are* duplicate entries of *some*
1794b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // LOCAL symbols in the normal nlist data. To handle this situation correctly, we must first attempt
1795b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // to parse any DSC unmapped symbol information. If we find any, we set a flag that tells the normal
1796b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // nlist parser to ignore all LOCAL symbols.
17974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
1798b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        if (m_header.flags & 0x80000000u)
1799b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
1800b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Before we can start mapping the DSC, we need to make certain the target process is actually
1801b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // using the cache we can find.
1802b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1803b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Next we need to determine the correct path for the dyld shared cache.
1804b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1805b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
1806b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            char dsc_path[PATH_MAX];
1807b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1808b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            snprintf(dsc_path, sizeof(dsc_path), "%s%s%s",
18099badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                     "/System/Library/Caches/com.apple.dyld/",  /* IPHONE_DYLD_SHARED_CACHE_DIR */
18109badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                     "dyld_shared_cache_",          /* DYLD_SHARED_CACHE_BASE_NAME */
1811b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                     header_arch.GetArchitectureName());
1812b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1813b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            FileSpec dsc_filespec(dsc_path, false);
1814b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1815b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // We need definitions of two structures in the on-disk DSC, copy them here manually
18162120aef346c158f12ba72129796c6164a4981585Jason Molenda            struct lldb_copy_dyld_cache_header_v0
18172120aef346c158f12ba72129796c6164a4981585Jason Molenda            {
18182120aef346c158f12ba72129796c6164a4981585Jason Molenda                char        magic[16];            // e.g. "dyld_v0    i386", "dyld_v1   armv7", etc.
18192120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t    mappingOffset;        // file offset to first dyld_cache_mapping_info
18202120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t    mappingCount;         // number of dyld_cache_mapping_info entries
18212120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t    imagesOffset;
18222120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t    imagesCount;
18232120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    dyldBaseAddress;
18242120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    codeSignatureOffset;
18252120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    codeSignatureSize;
18262120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    slideInfoOffset;
18272120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    slideInfoSize;
18282120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    localSymbolsOffset;   // file offset of where local symbols are stored
18292120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t    localSymbolsSize;     // size of local symbols information
18302120aef346c158f12ba72129796c6164a4981585Jason Molenda            };
18312120aef346c158f12ba72129796c6164a4981585Jason Molenda            struct lldb_copy_dyld_cache_header_v1
1832ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            {
18332120aef346c158f12ba72129796c6164a4981585Jason Molenda                char        magic[16];            // e.g. "dyld_v0    i386", "dyld_v1   armv7", etc.
18342120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t    mappingOffset;        // file offset to first dyld_cache_mapping_info
18352120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t    mappingCount;         // number of dyld_cache_mapping_info entries
18369badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint32_t    imagesOffset;
18379badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint32_t    imagesCount;
18389badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    dyldBaseAddress;
18399badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    codeSignatureOffset;
18409badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    codeSignatureSize;
18419badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    slideInfoOffset;
18429badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    slideInfoSize;
18439badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    localSymbolsOffset;
18449badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                uint64_t    localSymbolsSize;
18452120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint8_t     uuid[16];             // v1 and above, also recorded in dyld_all_image_infos v13 and later
1846ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            };
18476bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
18482120aef346c158f12ba72129796c6164a4981585Jason Molenda            struct lldb_copy_dyld_cache_mapping_info
18492120aef346c158f12ba72129796c6164a4981585Jason Molenda            {
18502120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t        address;
18512120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t        size;
18522120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint64_t        fileOffset;
18532120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        maxProt;
18542120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        initProt;
18552120aef346c158f12ba72129796c6164a4981585Jason Molenda            };
18566bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
1857ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            struct lldb_copy_dyld_cache_local_symbols_info
1858ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            {
18592120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        nlistOffset;
18602120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        nlistCount;
18612120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        stringsOffset;
18622120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        stringsSize;
18632120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        entriesOffset;
18642120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        entriesCount;
1865ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            };
1866ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            struct lldb_copy_dyld_cache_local_symbols_entry
1867ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            {
18682120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        dylibOffset;
18692120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        nlistStartIndex;
18702120aef346c158f12ba72129796c6164a4981585Jason Molenda                uint32_t        nlistCount;
1871ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton            };
1872b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1873fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda            /* The dyld_cache_header has a pointer to the dyld_cache_local_symbols_info structure (localSymbolsOffset).
1874fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda               The dyld_cache_local_symbols_info structure gives us three things:
1875fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda                 1. The start and count of the nlist records in the dyld_shared_cache file
1876fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda                 2. The start and size of the strings for these nlist records
1877fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda                 3. The start and count of dyld_cache_local_symbols_entry entries
1878fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda
1879fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda               There is one dyld_cache_local_symbols_entry per dylib/framework in the dyld shared cache.
1880fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda               The "dylibOffset" field is the Mach-O header of this dylib/framework in the dyld shared cache.
18819badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda               The dyld_cache_local_symbols_entry also lists the start of this dylib/framework's nlist records
1882fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda               and the count of how many nlist records there are for this dylib/framework.
1883fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda            */
1884fd3b35d8374196b1c69397a52c797f8e93cda27aJason Molenda
1885b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Process the dsc header to find the unmapped symbols
1886b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            //
1887b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            // Save some VM space, do not map the entire cache in one shot.
1888b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
18896bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda            DataBufferSP dsc_data_sp;
18906bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda            dsc_data_sp = dsc_filespec.MemoryMapFileContents(0, sizeof(struct lldb_copy_dyld_cache_header_v1));
18916bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
18926bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda            if (dsc_data_sp)
1893b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            {
189436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                DataExtractor dsc_header_data(dsc_data_sp, byte_order, addr_byte_size);
1895b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
18966bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                char version_str[17];
18976bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                int version = -1;
18986bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                lldb::offset_t offset = 0;
18996bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                memcpy (version_str, dsc_header_data.GetData (&offset, 16), 16);
19006bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                version_str[16] = '\0';
19016bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                if (strncmp (version_str, "dyld_v", 6) == 0 && isdigit (version_str[6]))
19026bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                {
19036bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    int v;
19046bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    if (::sscanf (version_str + 6, "%d", &v) == 1)
19056bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    {
19066bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                        version = v;
19076bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    }
19086bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                }
19096bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
191045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                UUID dsc_uuid;
191145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                if (version >= 1)
191245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                {
191345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    offset = offsetof (struct lldb_copy_dyld_cache_header_v1, uuid);
191445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    uint8_t uuid_bytes[sizeof (uuid_t)];
191545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    memcpy (uuid_bytes, dsc_header_data.GetData (&offset, sizeof (uuid_t)), sizeof (uuid_t));
191645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    dsc_uuid.SetBytes (uuid_bytes);
191745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                }
191845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
191945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                bool uuid_match = true;
192045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                if (dsc_uuid.IsValid() && process)
192145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                {
192245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    UUID shared_cache_uuid(GetProcessSharedCacheUUID(process));
192345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
192445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    if (shared_cache_uuid.IsValid() && dsc_uuid != shared_cache_uuid)
192545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    {
192645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                        // The on-disk dyld_shared_cache file is not the same as the one in this
192745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                        // process' memory, don't use it.
192845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                        uuid_match = false;
19296ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda                        ModuleSP module_sp (GetModule());
19306ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda                        if (module_sp)
19316ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda                            module_sp->ReportWarning ("process shared cache does not match on-disk dyld_shared_cache file, some symbol names will be missing.");
193245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    }
193345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                }
193445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
19359badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                offset = offsetof (struct lldb_copy_dyld_cache_header_v1, mappingOffset);
19366bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
1937b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                uint32_t mappingOffset = dsc_header_data.GetU32(&offset);
1938b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1939b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                // If the mappingOffset points to a location inside the header, we've
1940b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                // opened an old dyld shared cache, and should not proceed further.
194145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                if (uuid_match && mappingOffset >= sizeof(struct lldb_copy_dyld_cache_header_v0))
1942b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                {
1943b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
19446bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    DataBufferSP dsc_mapping_info_data_sp = dsc_filespec.MemoryMapFileContents(mappingOffset, sizeof (struct lldb_copy_dyld_cache_mapping_info));
19456bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    DataExtractor dsc_mapping_info_data(dsc_mapping_info_data_sp, byte_order, addr_byte_size);
19466bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    offset = 0;
19476bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
19486bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    // The File addresses (from the in-memory Mach-O load commands) for the shared libraries
19496bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    // in the shared library cache need to be adjusted by an offset to match up with the
19506bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    // dylibOffset identifying field in the dyld_cache_local_symbol_entry's.  This offset is
19516bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    // recorded in mapping_offset_value.
19526bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    const uint64_t mapping_offset_value = dsc_mapping_info_data.GetU64(&offset);
19536bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda
19546bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                    offset = offsetof (struct lldb_copy_dyld_cache_header_v1, localSymbolsOffset);
1955b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    uint64_t localSymbolsOffset = dsc_header_data.GetU64(&offset);
1956b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    uint64_t localSymbolsSize = dsc_header_data.GetU64(&offset);
1957b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
19589badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                    if (localSymbolsOffset && localSymbolsSize)
1959b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    {
1960b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        // Map the local symbols
19619badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                        if (DataBufferSP dsc_local_symbols_data_sp = dsc_filespec.MemoryMapFileContents(localSymbolsOffset, localSymbolsSize))
1962b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        {
196336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                            DataExtractor dsc_local_symbols_data(dsc_local_symbols_data_sp, byte_order, addr_byte_size);
1964b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1965b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            offset = 0;
1966b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1967b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            // Read the local_symbols_infos struct in one shot
1968b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            struct lldb_copy_dyld_cache_local_symbols_info local_symbols_info;
1969b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            dsc_local_symbols_data.GetU32(&offset, &local_symbols_info.nlistOffset, 6);
1970b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1971b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            SectionSP text_section_sp(section_list->FindSectionByName(GetSegmentNameTEXT()));
1972b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
19736bcabae25ca2260d33e864c178ecd9aae119a273Jason Molenda                            uint32_t header_file_offset = (text_section_sp->GetFileAddress() - mapping_offset_value);
1974b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1975b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            offset = local_symbols_info.entriesOffset;
1976b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            for (uint32_t entry_index = 0; entry_index < local_symbols_info.entriesCount; entry_index++)
1977b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            {
1978b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                struct lldb_copy_dyld_cache_local_symbols_entry local_symbols_entry;
1979b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                local_symbols_entry.dylibOffset = dsc_local_symbols_data.GetU32(&offset);
1980b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                local_symbols_entry.nlistStartIndex = dsc_local_symbols_data.GetU32(&offset);
1981b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                local_symbols_entry.nlistCount = dsc_local_symbols_data.GetU32(&offset);
1982b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
19839badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                if (header_file_offset == local_symbols_entry.dylibOffset)
1984b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                {
1985b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    unmapped_local_symbols_found = local_symbols_entry.nlistCount;
1986b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1987b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    // The normal nlist code cannot correctly size the Symbols array, we need to allocate it here.
1988b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    sym = symtab->Resize (symtab_load_command.nsyms + m_dysymtab.nindirectsyms + unmapped_local_symbols_found - m_dysymtab.nlocalsym);
1989b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    num_syms = symtab->GetNumSymbols();
1990b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
1991b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    nlist_data_offset = local_symbols_info.nlistOffset + (nlist_byte_size * local_symbols_entry.nlistStartIndex);
1992b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    uint32_t string_table_offset = local_symbols_info.stringsOffset;
1993b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
19949badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                    for (uint32_t nlist_index = 0; nlist_index < local_symbols_entry.nlistCount; nlist_index++)
1995b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    {
1996b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        /////////////////////////////
1997b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        {
1998b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            struct nlist_64 nlist;
1999b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (!dsc_local_symbols_data.ValidOffsetForDataOfSize(nlist_data_offset, nlist_byte_size))
2000b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                break;
2001b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2002b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_strx  = dsc_local_symbols_data.GetU32_unchecked(&nlist_data_offset);
2003b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_type  = dsc_local_symbols_data.GetU8_unchecked (&nlist_data_offset);
2004b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_sect  = dsc_local_symbols_data.GetU8_unchecked (&nlist_data_offset);
2005b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_desc  = dsc_local_symbols_data.GetU16_unchecked (&nlist_data_offset);
2006b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            nlist.n_value = dsc_local_symbols_data.GetAddress_unchecked (&nlist_data_offset);
2007b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2008b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            SymbolType type = eSymbolTypeInvalid;
2009b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            const char *symbol_name = dsc_local_symbols_data.PeekCStr(string_table_offset + nlist.n_strx);
2010b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2011b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (symbol_name == NULL)
2012b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2013b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                // No symbol should be NULL, even the symbols with no
2014b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                // string values should have an offset zero which points
2015b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                // to an empty C-string
2016b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                Host::SystemLog (Host::eSystemLogError,
201797a19b21dacd9063bb5475812df7781777262198Greg Clayton                                                                 "error: DSC unmapped local symbol[%u] has invalid string table offset 0x%x in %s, ignoring symbol\n",
2018b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 entry_index,
2019b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                 nlist.n_strx,
202097a19b21dacd9063bb5475812df7781777262198Greg Clayton                                                                 module_sp->GetFileSpec().GetPath().c_str());
2021b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                continue;
2022b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2023b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (symbol_name[0] == '\0')
2024b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                symbol_name = NULL;
2025b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2026b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            const char *symbol_name_non_abi_mangled = NULL;
2027b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2028b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            SectionSP symbol_section;
2029b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            uint32_t symbol_byte_size = 0;
2030b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            bool add_nlist = true;
2031b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            bool is_debug = ((nlist.n_type & NlistMaskStab) != 0);
203201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                            bool demangled_is_synthesized = false;
2033a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                            bool is_gsym = false;
2034b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2035b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            assert (sym_idx < num_syms);
2036b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2037b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            sym[sym_idx].SetDebug (is_debug);
2038b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2039b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (is_debug)
2040b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2041b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                switch (nlist.n_type)
2042b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2043b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabGlobalSymbol:
2044b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_GSYM -- global symbol: name,,NO_SECT,type,0
2045b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Sometimes the N_GSYM value contains the address.
2046b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2047b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // FIXME: In the .o files, we have a GSYM and a debug symbol for all the ObjC data.  They
2048b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // have the same address, but we want to ensure that we always find only the real symbol,
2049b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // 'cause we don't currently correctly attribute the GSYM one to the ObjCClass/Ivar/MetaClass
2050b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // symbol type.  This is a temporary hack to make sure the ObjectiveC symbols get treated
2051b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // correctly.  To do this right, we should coalesce all the GSYM & global symbols that have the
2052b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // same address.
2053b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2054b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_name && symbol_name[0] == '_' && symbol_name[1] ==  'O'
2055b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            && (strncmp (symbol_name, "_OBJC_IVAR_$_", strlen ("_OBJC_IVAR_$_")) == 0
2056b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                || strncmp (symbol_name, "_OBJC_CLASS_$_", strlen ("_OBJC_CLASS_$_")) == 0
2057b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                || strncmp (symbol_name, "_OBJC_METACLASS_$_", strlen ("_OBJC_METACLASS_$_")) == 0))
2058b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            add_nlist = false;
2059b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
2060b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2061a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            is_gsym = true;
2062b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            sym[sym_idx].SetExternal(true);
2063b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (nlist.n_value != 0)
2064b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2065b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeData;
2066b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2067b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2068b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2069b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabFunctionName:
2070b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0
2071b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
2072b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2073b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2074b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabFunction:
2075b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_FUN -- procedure: name,,n_sect,linenumber,address
2076b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_name)
2077b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2078b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeCode;
2079b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2080b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2081b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_FUN_addr_to_sym_idx[nlist.n_value] = sym_idx;
2082b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // We use the current number of symbols in the symbol table in lieu of
2083b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // using nlist_idx in case we ever start trimming entries out
2084b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_FUN_indexes.push_back(sym_idx);
2085b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2086b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
2087b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2088b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            type = eSymbolTypeCompiler;
2089b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2090b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if ( !N_FUN_indexes.empty() )
2091b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2092b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Copy the size of the function into the original STAB entry so we don't have
2093b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // to hunt for it later
2094b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symtab->SymbolAtIndex(N_FUN_indexes.back())->SetByteSize(nlist.n_value);
2095b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                N_FUN_indexes.pop_back();
2096b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // We don't really need the end function STAB as it contains the size which
2097b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // we already placed with the original symbol, so don't add it if we want a
2098b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // minimal symbol table
20997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                add_nlist = false;
2100b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2101b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2102b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2103b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2104b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabStaticSymbol:
2105b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_STSYM -- static symbol: name,,n_sect,type,address
2106b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_STSYM_addr_to_sym_idx[nlist.n_value] = sym_idx;
2107b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2108b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeData;
2109b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2110b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2111b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLocalCommon:
2112b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address
2113b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2114b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCommonBlock;
2115b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2116b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2117b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabBeginSymbol:
2118b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_BNSYM
2119b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
2120b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
21217940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                        // Skip these if we want minimal symbol tables
21227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                        add_nlist = false;
2123b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2124b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2125b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndSymbol:
2126b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ENSYM
2127b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_BNSYM to the terminating index of this N_ENSYM
2128b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
2129b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
21307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                        // Skip these if we want minimal symbol tables
21317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                        add_nlist = false;
2132b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2133b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2134b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2135b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabSourceFileOptions:
2136b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_OPT - emitted with gcc2_compiled and in gcc source
2137b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
2138b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2139b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2140b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabRegisterSymbol:
2141b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_RSYM - register sym: name,,NO_SECT,type,register
2142b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeVariable;
2143b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2144b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2145b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabSourceLine:
2146b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SLINE - src line: 0,,n_sect,linenumber,address
2147b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2148b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeLineEntry;
2149b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2150b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2151b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabStructureType:
2152b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset
2153b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeVariableType;
2154b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2155b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2156b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabSourceFileName:
2157b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SO - source file name
2158b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeSourceFile;
2159b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (symbol_name == NULL)
2160b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
21617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                            add_nlist = false;
2162b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (N_SO_index != UINT32_MAX)
2163b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2164b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Set the size of the N_SO to the terminating index of this N_SO
2165b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // so that we can always skip the entire N_SO if we need to navigate
2166b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // more quickly at the source level when parsing STABS
2167b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr = symtab->SymbolAtIndex(N_SO_index);
21687940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                symbol_ptr->SetByteSize(sym_idx);
2169b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_ptr->SetSizeIsSibling(true);
2170b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2171b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_NSYM_indexes.clear();
2172b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_INCL_indexes.clear();
2173b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_BRAC_indexes.clear();
2174b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_COMM_indexes.clear();
2175b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_FUN_indexes.clear();
2176b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_SO_index = UINT32_MAX;
2177b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2178b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        else
2179b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2180b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // We use the current number of symbols in the symbol table in lieu of
2181b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // using nlist_idx in case we ever start trimming entries out
2182b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            const bool N_SO_has_full_path = symbol_name[0] == '/';
2183b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (N_SO_has_full_path)
2184b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
21857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                                if ((N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
2186b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
2187b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // We have two consecutive N_SO entries where the first contains a directory
2188b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // and the second contains a full path.
2189292cca834d6ce7e78509e3bf09b7d1a4bc6614e9Jason Molenda                                                                    sym[sym_idx - 1].GetMangled().SetValue(ConstString(symbol_name), false);
2190b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
2191b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    add_nlist = false;
2192b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
2193b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                else
2194b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
2195b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // This is the first entry in a N_SO that contains a directory or
2196b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    // a full path to the source file
2197b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    N_SO_index = sym_idx;
2198b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
2199b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
22007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                            else if ((N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
2201b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2202b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // This is usually the second N_SO entry that contains just the filename,
2203b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // so here we combine it with the first one if we are minimizing the symbol table
2204b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                const char *so_path = sym[sym_idx - 1].GetMangled().GetDemangledName().AsCString();
2205b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (so_path && so_path[0])
2206b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
2207b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    std::string full_so_path (so_path);
22084df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                    const size_t double_slash_pos = full_so_path.find("//");
22094df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                    if (double_slash_pos != std::string::npos)
22104df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                    {
22114df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        // The linker has been generating bad N_SO entries with doubled up paths
22124df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        // in the format "%s%s" where the first stirng in the DW_AT_comp_dir,
22134df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        // and the second is the directory for the source file so you end up with
22144df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        // a path that looks like "/tmp/src//tmp/src/"
22154df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        FileSpec so_dir(so_path, false);
22164df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        if (!so_dir.Exists())
22174df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        {
22184df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                            so_dir.SetFile(&full_so_path[double_slash_pos + 1], false);
22194df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                            if (so_dir.Exists())
22204df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                            {
22214df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                                // Trim off the incorrect path
22224df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                                full_so_path.erase(0, double_slash_pos + 1);
22234df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                            }
22244df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                        }
22254df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                                                    }
2226b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    if (*full_so_path.rbegin() != '/')
2227b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        full_so_path += '/';
2228b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    full_so_path += symbol_name;
2229292cca834d6ce7e78509e3bf09b7d1a4bc6614e9Jason Molenda                                                                    sym[sym_idx - 1].GetMangled().SetValue(ConstString(full_so_path.c_str()), false);
2230b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    add_nlist = false;
2231b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
2232b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
2233b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2234ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                                                            else
2235ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                                                            {
2236ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                                                                // This could be a relative path to a N_SO
2237ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                                                                N_SO_index = sym_idx;
2238ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                                                            }
2239b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2240b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2241b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2242b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabObjectFileName:
2243b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_OSO - object file name: name,,0,0,st_mtime
2244b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeObjectFile;
2245b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2246b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2247b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLocalSymbol:
2248b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LSYM - local sym: name,,NO_SECT,type,offset
2249b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeLocal;
2250b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2251b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2252b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
2253b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // INCL scopes
2254b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
2255b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabBeginIncludeFileName:
2256b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_BINCL - include file beginning: name,,NO_SECT,0,sum
2257b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
2258b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
2259b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_INCL_indexes.push_back(sym_idx);
2260b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeBegin;
2261b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2262b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2263b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndIncludeFile:
2264b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_EINCL - include file end: name,,NO_SECT,0,0
2265b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_BINCL to the terminating index of this N_EINCL
2266b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
2267b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
2268b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if ( !N_INCL_indexes.empty() )
2269b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2270b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr = symtab->SymbolAtIndex(N_INCL_indexes.back());
2271b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetByteSize(sym_idx + 1);
2272b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetSizeIsSibling(true);
2273b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_INCL_indexes.pop_back();
2274b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2275b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeEnd;
2276b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2277b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2278b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabIncludeFileName:
2279b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_SOL - #included file name: name,,n_sect,0,address
2280b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeHeaderFile;
2281b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2282b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We currently don't use the header files on darwin
22837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                        add_nlist = false;
2284b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2285b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2286b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabCompilerParameters:
2287b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_PARAMS - compiler parameters: name,,NO_SECT,0,0
2288b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
2289b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2290b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2291b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabCompilerVersion:
2292b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_VERSION - compiler version: name,,NO_SECT,0,0
2293b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
2294b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2295b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2296b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabCompilerOptLevel:
2297b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0
2298b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeCompiler;
2299b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2300b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2301b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabParameter:
2302b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_PSYM - parameter: name,,NO_SECT,type,offset
2303b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeVariable;
2304b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2305b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2306b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabAlternateEntry:
2307b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ENTRY - alternate entry: name,,n_sect,linenumber,address
2308b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2309b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeLineEntry;
2310b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2311b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2312b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
2313b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Left and Right Braces
2314b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
2315b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLeftBracket:
2316b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address
2317b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
2318b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
2319b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2320b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_BRAC_indexes.push_back(sym_idx);
2321b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeBegin;
2322b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2323b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2324b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabRightBracket:
2325b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address
2326b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_LBRAC to the terminating index of this N_RBRAC
2327b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
2328b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
2329b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2330b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if ( !N_BRAC_indexes.empty() )
2331b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2332b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr = symtab->SymbolAtIndex(N_BRAC_indexes.back());
2333b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetByteSize(sym_idx + 1);
2334b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetSizeIsSibling(true);
2335b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_BRAC_indexes.pop_back();
2336b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2337b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeEnd;
2338b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2339b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2340b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabDeletedIncludeFile:
2341b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_EXCL - deleted include file: name,,NO_SECT,0,sum
2342b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeHeaderFile;
2343b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2344b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2345b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
2346b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // COMM scopes
2347b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        //----------------------------------------------------------------------
2348b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabBeginCommon:
2349b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_BCOMM - begin common: name,,NO_SECT,0,0
2350b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // We use the current number of symbols in the symbol table in lieu of
2351b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // using nlist_idx in case we ever start trimming entries out
2352b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeBegin;
2353b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        N_COMM_indexes.push_back(sym_idx);
2354b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2355b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2356b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndCommonLocal:
2357b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ECOML - end common (local name): 0,,n_sect,0,address
2358b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2359b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Fall through
2360b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2361b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabEndCommon:
2362b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_ECOMM - end common: name,,n_sect,0,0
2363b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML
2364b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // so that we can always skip the entire symbol if we need to navigate
2365b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // more quickly at the source level when parsing STABS
2366b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if ( !N_COMM_indexes.empty() )
2367b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2368b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr = symtab->SymbolAtIndex(N_COMM_indexes.back());
2369b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetByteSize(sym_idx + 1);
2370b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            symbol_ptr->SetSizeIsSibling(true);
2371b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            N_COMM_indexes.pop_back();
2372b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2373b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeScopeEnd;
2374b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2375b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2376b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case StabLength:
2377b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // N_LENG - second stab entry with length information
2378b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeAdditional;
2379b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2380b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2381b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    default: break;
2382b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2383b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2384b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            else
2385b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2386b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                //uint8_t n_pext    = NlistMaskPrivateExternal & nlist.n_type;
2387b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                uint8_t n_type  = NlistMaskType & nlist.n_type;
2388b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0);
2389b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2390b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                switch (n_type)
2391b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2392b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeIndirect:         // N_INDR - Fall through
2393b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypePreboundUndefined:// N_PBUD - Fall through
2394b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeUndefined:        // N_UNDF
2395b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeUndefined;
2396b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2397b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2398b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeAbsolute:         // N_ABS
2399b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        type = eSymbolTypeAbsolute;
2400b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
2401b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2402b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    case NListTypeSection:          // N_SECT
2403b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
240401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
2405b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
240601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                            if (symbol_section == NULL)
2407b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
240801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                // TODO: warn about this?
240901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                add_nlist = false;
241001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                break;
2411b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
241201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton
241301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                            if (TEXT_eh_frame_sectID == nlist.n_sect)
241401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                            {
241501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                type = eSymbolTypeException;
241601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                            }
241701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                            else
2418b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
241901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                uint32_t section_type = symbol_section->Get() & SectionFlagMaskSectionType;
24209badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
242101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                switch (section_type)
2422b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                {
242301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeRegular:                     break; // regular section
242401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                                                        //case SectionTypeZeroFill:                 type = eSymbolTypeData;    break; // zero fill on demand section
242501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeCStringLiterals:            type = eSymbolTypeData;    break; // section with only literal C strings
242601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionType4ByteLiterals:              type = eSymbolTypeData;    break; // section with only 4 byte literals
242701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionType8ByteLiterals:              type = eSymbolTypeData;    break; // section with only 8 byte literals
242801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeLiteralPointers:            type = eSymbolTypeTrampoline; break; // section with only pointers to literals
242901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeNonLazySymbolPointers:      type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers
243001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeLazySymbolPointers:         type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers
243101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeSymbolStubs:                type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field
243201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for initialization
243301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for termination
243401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                                                                                  //case SectionTypeCoalesced:                type = eSymbolType;    break; // section contains symbols that are to be coalesced
243501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                                                                                  //case SectionTypeZeroFillLarge:            type = eSymbolTypeData;    break; // zero fill on demand section (that can be larger than 4 gigabytes)
243601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeInterposing:                type = eSymbolTypeTrampoline;  break; // section with only pairs of function pointers for interposing
243701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionType16ByteLiterals:             type = eSymbolTypeData;    break; // section with only 16 byte literals
243801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeDTraceObjectFormat:         type = eSymbolTypeInstrumentation; break;
243901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    case SectionTypeLazyDylibSymbolPointers:    type = eSymbolTypeTrampoline; break;
244001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    default: break;
2441b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                }
24429badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
244301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                if (type == eSymbolTypeInvalid)
244401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                {
244501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    const char *symbol_sect_name = symbol_section->GetName().AsCString();
244601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    if (symbol_section->IsDescendant (text_section_sp.get()))
244701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    {
244801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        if (symbol_section->IsClear(SectionAttrUserPureInstructions |
244901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                                    SectionAttrUserSelfModifyingCode |
245001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                                    SectionAttrSytemSomeInstructions))
245101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            type = eSymbolTypeData;
245201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        else
245301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            type = eSymbolTypeCode;
245401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    }
245501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    else if (symbol_section->IsDescendant(data_section_sp.get()))
2456b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    {
2457b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        if (symbol_sect_name && ::strstr (symbol_sect_name, "__objc") == symbol_sect_name)
2458b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        {
2459b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            type = eSymbolTypeRuntime;
24609badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
246101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            if (symbol_name &&
246201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                symbol_name[0] == '_' &&
246301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                symbol_name[1] == 'O' &&
2464b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                symbol_name[2] == 'B')
2465b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            {
2466b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                llvm::StringRef symbol_name_ref(symbol_name);
2467b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                static const llvm::StringRef g_objc_v2_prefix_class ("_OBJC_CLASS_$_");
2468b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                static const llvm::StringRef g_objc_v2_prefix_metaclass ("_OBJC_METACLASS_$_");
2469b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                static const llvm::StringRef g_objc_v2_prefix_ivar ("_OBJC_IVAR_$_");
2470b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                if (symbol_name_ref.startswith(g_objc_v2_prefix_class))
2471b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2472b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name_non_abi_mangled = symbol_name + 1;
2473b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2474b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    type = eSymbolTypeObjCClass;
247501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                    demangled_is_synthesized = true;
2476b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2477b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                else if (symbol_name_ref.startswith(g_objc_v2_prefix_metaclass))
2478b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2479b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name_non_abi_mangled = symbol_name + 1;
2480b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2481b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    type = eSymbolTypeObjCMetaClass;
248201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                    demangled_is_synthesized = true;
2483b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2484b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                else if (symbol_name_ref.startswith(g_objc_v2_prefix_ivar))
2485b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                {
2486b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name_non_abi_mangled = symbol_name + 1;
2487b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2488b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                    type = eSymbolTypeObjCIVar;
248901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                    demangled_is_synthesized = true;
2490b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                                }
2491b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            }
2492b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        }
249301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        else if (symbol_sect_name && ::strstr (symbol_sect_name, "__gcc_except_tab") == symbol_sect_name)
2494b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        {
249501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            type = eSymbolTypeException;
2496b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        }
2497b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                        else
249801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        {
249901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            type = eSymbolTypeData;
250001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        }
250101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    }
250201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    else if (symbol_sect_name && ::strstr (symbol_sect_name, "__IMPORT") == symbol_sect_name)
250301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    {
250401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        type = eSymbolTypeTrampoline;
250501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    }
250601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    else if (symbol_section->IsDescendant(objc_section_sp.get()))
250701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    {
250801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        type = eSymbolTypeRuntime;
250901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        if (symbol_name && symbol_name[0] == '.')
251001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        {
251101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            llvm::StringRef symbol_name_ref(symbol_name);
251201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            static const llvm::StringRef g_objc_v1_prefix_class (".objc_class_name_");
251301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                            if (symbol_name_ref.startswith(g_objc_v1_prefix_class))
2514b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            {
251501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                symbol_name_non_abi_mangled = symbol_name;
251601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                symbol_name = symbol_name + g_objc_v1_prefix_class.size();
251701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                type = eSymbolTypeObjCClass;
251801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                                demangled_is_synthesized = true;
2519b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                            }
252001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                        }
252101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                    }
252201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                                }
2523b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2524b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2525b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        break;
25269badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                                }
2527b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2528b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2529b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            if (add_nlist)
2530b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2531b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                uint64_t symbol_value = nlist.n_value;
2532b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (symbol_name_non_abi_mangled)
2533b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2534292cca834d6ce7e78509e3bf09b7d1a4bc6614e9Jason Molenda                                                    sym[sym_idx].GetMangled().SetMangledName (ConstString(symbol_name_non_abi_mangled));
2535292cca834d6ce7e78509e3bf09b7d1a4bc6614e9Jason Molenda                                                    sym[sym_idx].GetMangled().SetDemangledName (ConstString(symbol_name));
2536b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2537b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                else
2538b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
25397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                    bool symbol_name_is_mangled = false;
25407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
2541b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (symbol_name && symbol_name[0] == '_')
2542b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2543b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_name_is_mangled = symbol_name[1] == '_';
2544b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        symbol_name++;  // Skip the leading underscore
2545b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
25469badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2547b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (symbol_name)
2548b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2549a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        ConstString const_symbol_name(symbol_name);
2550a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        sym[sym_idx].GetMangled().SetValue(const_symbol_name, symbol_name_is_mangled);
25517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                        if (is_gsym && is_debug)
25527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                            N_GSYM_name_to_sym_idx[sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled).GetCString()] = sym_idx;
2553b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2554b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
2555b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (symbol_section)
2556b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                {
2557b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    const addr_t section_file_addr = symbol_section->GetFileAddress();
2558b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    if (symbol_byte_size == 0 && function_starts_count > 0)
2559b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    {
2560b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        addr_t symbol_lookup_file_addr = nlist.n_value;
2561b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // Do an exact address match for non-ARM addresses, else get the closest since
2562b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        // the symbol might be a thumb symbol which has an address with bit zero set
2563b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        FunctionStarts::Entry *func_start_entry = function_starts.FindEntry (symbol_lookup_file_addr, !is_arm);
2564b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (is_arm && func_start_entry)
2565b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2566b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // Verify that the function start address is the symbol address (ARM)
2567b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            // or the symbol address + 1 (thumb)
2568b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (func_start_entry->addr != symbol_lookup_file_addr &&
2569b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                func_start_entry->addr != (symbol_lookup_file_addr + 1))
2570b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2571b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Not the right entry, NULL it out...
2572b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                func_start_entry = NULL;
2573b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2574b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2575b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        if (func_start_entry)
2576b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        {
2577b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            func_start_entry->data = true;
25789badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2579b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            addr_t symbol_file_addr = func_start_entry->addr;
2580b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            uint32_t symbol_flags = 0;
2581b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (is_arm)
2582b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2583b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (symbol_file_addr & 1)
2584b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    symbol_flags = MACHO_NLIST_ARM_SYMBOL_IS_THUMB;
2585b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_file_addr &= 0xfffffffffffffffeull;
2586b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
25879badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2588b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            const FunctionStarts::Entry *next_func_start_entry = function_starts.FindNextEntry (func_start_entry);
2589b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            const addr_t section_end_file_addr = section_file_addr + symbol_section->GetByteSize();
2590b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            if (next_func_start_entry)
2591b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2592b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                addr_t next_symbol_file_addr = next_func_start_entry->addr;
2593b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // Be sure the clear the Thumb address bit when we calculate the size
2594b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                // from the current and next address
2595b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                if (is_arm)
2596b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                    next_symbol_file_addr &= 0xfffffffffffffffeull;
2597b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_byte_size = std::min<lldb::addr_t>(next_symbol_file_addr - symbol_file_addr, section_end_file_addr - symbol_file_addr);
2598b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2599b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            else
2600b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            {
2601b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                                symbol_byte_size = section_end_file_addr - symbol_file_addr;
2602b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                            }
2603b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                        }
2604b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    }
2605b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    symbol_value -= section_file_addr;
2606b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                }
26079badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2608a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                if (is_debug == false)
2609a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                {
2610a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                    if (type == eSymbolTypeCode)
2611a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                    {
2612a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // See if we can find a N_FUN entry for any code symbols.
2613a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // If we do find a match, and the name matches, then we
2614a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // can merge the two into just the function symbol to avoid
2615a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // duplicate entries in the symbol table
2616a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        ValueToSymbolIndexMap::const_iterator pos = N_FUN_addr_to_sym_idx.find (nlist.n_value);
2617a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        if (pos != N_FUN_addr_to_sym_idx.end())
2618a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        {
26197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                            if (sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled) == sym[pos->second].GetMangled().GetName(Mangled::ePreferMangled))
2620a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            {
2621a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
2622a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // We just need the flags from the linker symbol, so put these flags
2623a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // into the N_FUN flags to avoid duplicate symbols in the symbol table
2624a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
2625a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[sym_idx].Clear();
2626a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                continue;
2627a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            }
2628a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        }
2629a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                    }
2630a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                    else if (type == eSymbolTypeData)
2631a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                    {
2632a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // See if we can find a N_STSYM entry for any data symbols.
2633a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // If we do find a match, and the name matches, then we
2634a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // can merge the two into just the Static symbol to avoid
2635a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        // duplicate entries in the symbol table
2636a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        ValueToSymbolIndexMap::const_iterator pos = N_STSYM_addr_to_sym_idx.find (nlist.n_value);
2637a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        if (pos != N_STSYM_addr_to_sym_idx.end())
2638a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        {
26397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                            if (sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled) == sym[pos->second].GetMangled().GetName(Mangled::ePreferMangled))
2640a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            {
2641a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
2642a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // We just need the flags from the linker symbol, so put these flags
2643a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // into the N_STSYM flags to avoid duplicate symbols in the symbol table
2644a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
2645a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[sym_idx].Clear();
2646a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                continue;
2647a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            }
2648a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        }
2649a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        else
2650a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        {
2651a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            // Combine N_GSYM stab entries with the non stab symbol
26527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                                                            ConstNameToSymbolIndexMap::const_iterator pos = N_GSYM_name_to_sym_idx.find(sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled).GetCString());
2653a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            if (pos != N_GSYM_name_to_sym_idx.end())
2654a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            {
2655a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                const uint32_t GSYM_sym_idx = pos->second;
2656a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                m_nlist_idx_to_sym_idx[nlist_idx] = GSYM_sym_idx;
2657a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // Copy the address, because often the N_GSYM address has an invalid address of zero
2658a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // when the global is a common symbol
2659a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[GSYM_sym_idx].GetAddress().SetSection (symbol_section);
2660a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[GSYM_sym_idx].GetAddress().SetOffset (symbol_value);
2661a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // We just need the flags from the linker symbol, so put these flags
2662a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                // into the N_STSYM flags to avoid duplicate symbols in the symbol table
2663a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[GSYM_sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
2664a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                sym[sym_idx].Clear();
2665a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                                continue;
2666a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                            }
2667a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                        }
2668a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                    }
2669a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                                }
2670a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton
2671b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetID (nlist_idx);
2672b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetType (type);
2673b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].GetAddress().SetSection (symbol_section);
2674b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].GetAddress().SetOffset (symbol_value);
2675b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
26769badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2677b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                if (symbol_byte_size > 0)
2678b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                    sym[sym_idx].SetByteSize(symbol_byte_size);
2679b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
268001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                if (demangled_is_synthesized)
268101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                    sym[sym_idx].SetDemangledNameIsSynthesized(true);
2682b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                ++sym_idx;
2683b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
2684b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            else
2685b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            {
2686b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                                sym[sym_idx].Clear();
2687b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                            }
26889badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2689b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        }
2690b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                        /////////////////////////////
2691b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    }
2692b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                    break; // No more entries to consider
2693b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                                }
2694b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                            }
2695b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                        }
2696b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                    }
2697b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda                }
2698b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            }
2699b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2700b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2701b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // Must reset this in case it was mutated above!
2702b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        nlist_data_offset = 0;
2703b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda#endif
2704b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2705b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // If the sym array was not created while parsing the DSC unmapped
2706b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        // symbols, create it now.
2707b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        if (sym == NULL)
2708b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
2709b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            sym = symtab->Resize (symtab_load_command.nsyms + m_dysymtab.nindirectsyms);
2710b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            num_syms = symtab->GetNumSymbols();
2711b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2712b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2713b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        if (unmapped_local_symbols_found)
2714b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
2715b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            assert(m_dysymtab.ilocalsym == 0);
2716b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            nlist_data_offset += (m_dysymtab.nlocalsym * nlist_byte_size);
2717b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            nlist_idx = m_dysymtab.nlocalsym;
2718b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2719b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        else
2720b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        {
2721b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda            nlist_idx = 0;
2722b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        }
2723b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda
2724b62abd5162c166f81e5c9b473f754d957657b891Jason Molenda        for (; nlist_idx < symtab_load_command.nsyms; ++nlist_idx)
27254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
27264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            struct nlist_64 nlist;
27274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (!nlist_data.ValidOffsetForDataOfSize(nlist_data_offset, nlist_byte_size))
27284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                break;
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_strx  = nlist_data.GetU32_unchecked(&nlist_data_offset);
27314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_type  = nlist_data.GetU8_unchecked (&nlist_data_offset);
27324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_sect  = nlist_data.GetU8_unchecked (&nlist_data_offset);
27334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_desc  = nlist_data.GetU16_unchecked (&nlist_data_offset);
27344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            nlist.n_value = nlist_data.GetAddress_unchecked (&nlist_data_offset);
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            SymbolType type = eSymbolTypeInvalid;
2737dd29b97f71187509df339596c3397dea0e429754Greg Clayton            const char *symbol_name = NULL;
27389badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
27393a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            if (have_strtab_data)
2740dd29b97f71187509df339596c3397dea0e429754Greg Clayton            {
2741dd29b97f71187509df339596c3397dea0e429754Greg Clayton                symbol_name = strtab_data.PeekCStr(nlist.n_strx);
27429badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
2743dd29b97f71187509df339596c3397dea0e429754Greg Clayton                if (symbol_name == NULL)
2744dd29b97f71187509df339596c3397dea0e429754Greg Clayton                {
2745dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    // No symbol should be NULL, even the symbols with no
2746dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    // string values should have an offset zero which points
2747dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    // to an empty C-string
2748dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    Host::SystemLog (Host::eSystemLogError,
274997a19b21dacd9063bb5475812df7781777262198Greg Clayton                                     "error: symbol[%u] has invalid string table offset 0x%x in %s, ignoring symbol\n",
2750dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     nlist_idx,
2751dd29b97f71187509df339596c3397dea0e429754Greg Clayton                                     nlist.n_strx,
275297a19b21dacd9063bb5475812df7781777262198Greg Clayton                                     module_sp->GetFileSpec().GetPath().c_str());
2753dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    continue;
2754dd29b97f71187509df339596c3397dea0e429754Greg Clayton                }
2755dd29b97f71187509df339596c3397dea0e429754Greg Clayton                if (symbol_name[0] == '\0')
2756dd29b97f71187509df339596c3397dea0e429754Greg Clayton                    symbol_name = NULL;
27574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
27583a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            else
27593a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            {
27603a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                const addr_t str_addr = strtab_addr + nlist.n_strx;
27613a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                Error str_error;
27623a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                if (process->ReadCStringFromMemory(str_addr, memory_symbol_name, str_error))
27633a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton                    symbol_name = memory_symbol_name.c_str();
27643a5dc01cf4c06eaa5057aef6a5289aec00c2adefGreg Clayton            }
27654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            const char *symbol_name_non_abi_mangled = NULL;
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            SectionSP symbol_section;
276836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            lldb::addr_t symbol_byte_size = 0;
27694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            bool add_nlist = true;
2770a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton            bool is_gsym = false;
27714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            bool is_debug = ((nlist.n_type & NlistMaskStab) != 0);
277201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            bool demangled_is_synthesized = false;
277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            assert (sym_idx < num_syms);
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            sym[sym_idx].SetDebug (is_debug);
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (is_debug)
27794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
27804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                switch (nlist.n_type)
27814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
27829badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                case StabGlobalSymbol:
27834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_GSYM -- global symbol: name,,NO_SECT,type,0
27844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Sometimes the N_GSYM value contains the address.
27859badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
27864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // FIXME: In the .o files, we have a GSYM and a debug symbol for all the ObjC data.  They
27874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // have the same address, but we want to ensure that we always find only the real symbol,
27884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // 'cause we don't currently correctly attribute the GSYM one to the ObjCClass/Ivar/MetaClass
27894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // symbol type.  This is a temporary hack to make sure the ObjectiveC symbols get treated
27904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // correctly.  To do this right, we should coalesce all the GSYM & global symbols that have the
27914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // same address.
27929badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
27939badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                    if (symbol_name && symbol_name[0] == '_' && symbol_name[1] ==  'O'
27944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        && (strncmp (symbol_name, "_OBJC_IVAR_$_", strlen ("_OBJC_IVAR_$_")) == 0
27954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            || strncmp (symbol_name, "_OBJC_CLASS_$_", strlen ("_OBJC_CLASS_$_")) == 0
27964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            || strncmp (symbol_name, "_OBJC_METACLASS_$_", strlen ("_OBJC_METACLASS_$_")) == 0))
27974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        add_nlist = false;
27984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
27994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
2800a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        is_gsym = true;
28014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        sym[sym_idx].SetExternal(true);
28024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (nlist.n_value != 0)
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
28044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeData;
28054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
28064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabFunctionName:
28094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0
28104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
28114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28139badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                case StabFunction:
28144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_FUN -- procedure: name,,n_sect,linenumber,address
28154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name)
28164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
28174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeCode;
28184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
28199badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
28204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_FUN_addr_to_sym_idx[nlist.n_value] = sym_idx;
28214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // We use the current number of symbols in the symbol table in lieu of
28224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // using nlist_idx in case we ever start trimming entries out
28234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_FUN_indexes.push_back(sym_idx);
28244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
28254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
28264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
28274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        type = eSymbolTypeCompiler;
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if ( !N_FUN_indexes.empty() )
28304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
28314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // Copy the size of the function into the original STAB entry so we don't have
28324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // to hunt for it later
28334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symtab->SymbolAtIndex(N_FUN_indexes.back())->SetByteSize(nlist.n_value);
28344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            N_FUN_indexes.pop_back();
28354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // We don't really need the end function STAB as it contains the size which
28364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // we already placed with the original symbol, so don't add it if we want a
28374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // minimal symbol table
28387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            add_nlist = false;
28394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
28404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
28414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
28424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
28439badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                case StabStaticSymbol:
28444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_STSYM -- static symbol: name,,n_sect,type,address
28454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_STSYM_addr_to_sym_idx[nlist.n_value] = sym_idx;
28464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
28474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeData;
28484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
28494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
28504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLocalCommon:
28514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address
28524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
28534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCommonBlock;
28544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
28554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
28564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabBeginSymbol:
28574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_BNSYM
28584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
28594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
28607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    // Skip these if we want minimal symbol tables
28617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    add_nlist = false;
28624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
28634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
28644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndSymbol:
28654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ENSYM
28664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_BNSYM to the terminating index of this N_ENSYM
28674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
28684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
28697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    // Skip these if we want minimal symbol tables
28707940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    add_nlist = false;
28714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabSourceFileOptions:
28754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_OPT - emitted with gcc2_compiled and in gcc source
28764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
28774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabRegisterSymbol:
28804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_RSYM - register sym: name,,NO_SECT,type,register
28814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeVariable;
28824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabSourceLine:
28854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SLINE - src line: 0,,n_sect,linenumber,address
28864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
28874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeLineEntry;
28884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabStructureType:
28914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset
28924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeVariableType;
28934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabSourceFileName:
28964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SO - source file name
28974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeSourceFile;
28984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name == NULL)
28994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
29007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        add_nlist = false;
29014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (N_SO_index != UINT32_MAX)
29024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
29034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // Set the size of the N_SO to the terminating index of this N_SO
29044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // so that we can always skip the entire N_SO if we need to navigate
290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // more quickly at the source level when parsing STABS
29064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr = symtab->SymbolAtIndex(N_SO_index);
29077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            symbol_ptr->SetByteSize(sym_idx);
29084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            symbol_ptr->SetSizeIsSibling(true);
29094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
29104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_NSYM_indexes.clear();
29114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_INCL_indexes.clear();
29124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_BRAC_indexes.clear();
29134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_COMM_indexes.clear();
29144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_FUN_indexes.clear();
29154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_SO_index = UINT32_MAX;
29164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
29174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else
29184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
29194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // We use the current number of symbols in the symbol table in lieu of
29204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // using nlist_idx in case we ever start trimming entries out
29215fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        const bool N_SO_has_full_path = symbol_name[0] == '/';
29225fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        if (N_SO_has_full_path)
29235fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        {
29247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if ((N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
29255fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            {
29265fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // We have two consecutive N_SO entries where the first contains a directory
29275fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // and the second contains a full path.
2928c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                                sym[sym_idx - 1].GetMangled().SetValue(ConstString(symbol_name), false);
29295fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
29305fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                add_nlist = false;
29315fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            }
29325fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            else
29335fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            {
29345fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // This is the first entry in a N_SO that contains a directory or
29355fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                // a full path to the source file
29365fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                                N_SO_index = sym_idx;
29375fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            }
29385fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                        }
29397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        else if ((N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms))
29404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
29415fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            // This is usually the second N_SO entry that contains just the filename,
29425fa6cd36ba1806303de8c3973b36337574cd4dc2Greg Clayton                            // so here we combine it with the first one if we are minimizing the symbol table
29434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const char *so_path = sym[sym_idx - 1].GetMangled().GetDemangledName().AsCString();
29444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (so_path && so_path[0])
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
29464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                std::string full_so_path (so_path);
29474df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                const size_t double_slash_pos = full_so_path.find("//");
29484df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                if (double_slash_pos != std::string::npos)
29494df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                {
29504df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    // The linker has been generating bad N_SO entries with doubled up paths
29514df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    // in the format "%s%s" where the first stirng in the DW_AT_comp_dir,
29524df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    // and the second is the directory for the source file so you end up with
29534df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    // a path that looks like "/tmp/src//tmp/src/"
29544df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    FileSpec so_dir(so_path, false);
29554df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    if (!so_dir.Exists())
29564df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    {
29574df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                        so_dir.SetFile(&full_so_path[double_slash_pos + 1], false);
29584df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                        if (so_dir.Exists())
29594df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                        {
29604df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                            // Trim off the incorrect path
29614df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                            full_so_path.erase(0, double_slash_pos + 1);
29624df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                        }
29634df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                    }
29644df2b7f432a8a76f2073c4db9ed84bda9be68a30Greg Clayton                                }
29654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (*full_so_path.rbegin() != '/')
29664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    full_so_path += '/';
29674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                full_so_path += symbol_name;
2968c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                                sym[sym_idx - 1].GetMangled().SetValue(ConstString(full_so_path.c_str()), false);
29690ad086f3ab18d6927b9df2f79169607d3a5d90e4Greg Clayton                                add_nlist = false;
29704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1;
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
29724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
2973ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                        else
2974ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                        {
2975ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                            // This could be a relative path to a N_SO
2976ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                            N_SO_index = sym_idx;
2977ab77dcb5ff41709505eb73008af3e576bf4f55f3Greg Clayton                        }
29784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
29799badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
29804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
29814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabObjectFileName:
29834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_OSO - object file name: name,,0,0,st_mtime
29844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeObjectFile;
29854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
29864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLocalSymbol:
29884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LSYM - local sym: name,,NO_SECT,type,offset
29894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeLocal;
29904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
29914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
29924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
29934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // INCL scopes
29944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
29954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabBeginIncludeFileName:
29964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_BINCL - include file beginning: name,,NO_SECT,0,sum
29974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
29984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
29994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_INCL_indexes.push_back(sym_idx);
30004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeBegin;
30014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndIncludeFile:
30044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_EINCL - include file end: name,,NO_SECT,0,0
30054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_BINCL to the terminating index of this N_EINCL
30064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
30074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
30084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ( !N_INCL_indexes.empty() )
30094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
30104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(N_INCL_indexes.back());
30114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetByteSize(sym_idx + 1);
30124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetSizeIsSibling(true);
30134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_INCL_indexes.pop_back();
30144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
30154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeEnd;
30164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabIncludeFileName:
30194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_SOL - #included file name: name,,n_sect,0,address
30204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeHeaderFile;
30214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We currently don't use the header files on darwin
30237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    add_nlist = false;
30244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30269badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                case StabCompilerParameters:
30274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_PARAMS - compiler parameters: name,,NO_SECT,0,0
30284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
30294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabCompilerVersion:
30324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_VERSION - compiler version: name,,NO_SECT,0,0
30334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
30344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabCompilerOptLevel:
30374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0
30384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeCompiler;
30394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabParameter:
30424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_PSYM - parameter: name,,NO_SECT,type,offset
30434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeVariable;
30444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabAlternateEntry:
30474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ENTRY - alternate entry: name,,n_sect,linenumber,address
30484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
30494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeLineEntry;
30504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
30534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // Left and Right Braces
30544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
30554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLeftBracket:
30564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address
30574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
30584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
30594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
30604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_BRAC_indexes.push_back(sym_idx);
30614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeBegin;
30624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabRightBracket:
30654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address
30664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_LBRAC to the terminating index of this N_RBRAC
30674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
30684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
30694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
30704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ( !N_BRAC_indexes.empty() )
30714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
30724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(N_BRAC_indexes.back());
30734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetByteSize(sym_idx + 1);
30744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetSizeIsSibling(true);
30754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_BRAC_indexes.pop_back();
30764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
30774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeEnd;
30784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabDeletedIncludeFile:
30814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_EXCL - deleted include file: name,,NO_SECT,0,sum
30824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeHeaderFile;
30834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
30864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                // COMM scopes
30874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //----------------------------------------------------------------------
30884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabBeginCommon:
30894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_BCOMM - begin common: name,,NO_SECT,0,0
30904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // We use the current number of symbols in the symbol table in lieu of
30914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // using nlist_idx in case we ever start trimming entries out
30924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeBegin;
30934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    N_COMM_indexes.push_back(sym_idx);
30944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
30954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
30964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndCommonLocal:
30974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ECOML - end common (local name): 0,,n_sect,0,address
30984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
30994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Fall through
31004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
31014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabEndCommon:
31024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_ECOMM - end common: name,,n_sect,0,0
31034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML
31044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // so that we can always skip the entire symbol if we need to navigate
31054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // more quickly at the source level when parsing STABS
31064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ( !N_COMM_indexes.empty() )
31074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
31084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(N_COMM_indexes.back());
31094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetByteSize(sym_idx + 1);
31104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr->SetSizeIsSibling(true);
31114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        N_COMM_indexes.pop_back();
31124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
31134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeScopeEnd;
31144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case StabLength:
31174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    // N_LENG - second stab entry with length information
31184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeAdditional;
31194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                default: break;
31224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
31234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
31244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            else
31254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
31264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                //uint8_t n_pext    = NlistMaskPrivateExternal & nlist.n_type;
31274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                uint8_t n_type  = NlistMaskType & nlist.n_type;
31284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0);
312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                switch (n_type)
31314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
31324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeIndirect:         // N_INDR - Fall through
31334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypePreboundUndefined:// N_PBUD - Fall through
31344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeUndefined:        // N_UNDF
31354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeUndefined;
31364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeAbsolute:         // N_ABS
31394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    type = eSymbolTypeAbsolute;
31404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                case NListTypeSection:          // N_SECT
314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
31444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value);
314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3146b386d82334b65fb984348f2027b1cb7714de993fSean Callanan                        if (!symbol_section)
314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
31484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            // TODO: warn about this?
31494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            add_nlist = false;
31503f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            break;
31514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (TEXT_eh_frame_sectID == nlist.n_sect)
31544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
31554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            type = eSymbolTypeException;
31564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
31574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        else
31584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
31594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            uint32_t section_type = symbol_section->Get() & SectionFlagMaskSectionType;
31603f69eacbb218a37390822c89d3675bd740590382Greg Clayton
31614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            switch (section_type)
31623f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
31634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeRegular:                     break; // regular section
31644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            //case SectionTypeZeroFill:                 type = eSymbolTypeData;    break; // zero fill on demand section
31654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeCStringLiterals:            type = eSymbolTypeData;    break; // section with only literal C strings
31664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionType4ByteLiterals:              type = eSymbolTypeData;    break; // section with only 4 byte literals
31674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionType8ByteLiterals:              type = eSymbolTypeData;    break; // section with only 8 byte literals
31684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeLiteralPointers:            type = eSymbolTypeTrampoline; break; // section with only pointers to literals
31694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeNonLazySymbolPointers:      type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers
31704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeLazySymbolPointers:         type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers
31714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeSymbolStubs:                type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field
31724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for initialization
31734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode;    break; // section with only function pointers for termination
31744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            //case SectionTypeCoalesced:                type = eSymbolType;    break; // section contains symbols that are to be coalesced
31754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            //case SectionTypeZeroFillLarge:            type = eSymbolTypeData;    break; // zero fill on demand section (that can be larger than 4 gigabytes)
31764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeInterposing:                type = eSymbolTypeTrampoline;  break; // section with only pairs of function pointers for interposing
31774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionType16ByteLiterals:             type = eSymbolTypeData;    break; // section with only 16 byte literals
31784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeDTraceObjectFormat:         type = eSymbolTypeInstrumentation; break;
31794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            case SectionTypeLazyDylibSymbolPointers:    type = eSymbolTypeTrampoline; break;
31804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            default: break;
31813f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (type == eSymbolTypeInvalid)
31843f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
31854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const char *symbol_sect_name = symbol_section->GetName().AsCString();
31864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_section->IsDescendant (text_section_sp.get()))
3187811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                                {
31889badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                    if (symbol_section->IsClear(SectionAttrUserPureInstructions |
31899badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                                                SectionAttrUserSelfModifyingCode |
31904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                                SectionAttrSytemSomeInstructions))
31914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeData;
31924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    else
31934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeCode;
3194811b9c568bb0127f09a6cdd94842586eebf25d02Greg Clayton                                }
31954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
31964aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_section->IsDescendant(data_section_sp.get()))
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
31984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_sect_name && ::strstr (symbol_sect_name, "__objc") == symbol_sect_name)
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
32004aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeRuntime;
32013f69eacbb218a37390822c89d3675bd740590382Greg Clayton
32029badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                        if (symbol_name &&
32039badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                            symbol_name[0] == '_' &&
32049badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                            symbol_name[1] == 'O' &&
32054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name[2] == 'B')
32064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        {
32074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            llvm::StringRef symbol_name_ref(symbol_name);
32084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            static const llvm::StringRef g_objc_v2_prefix_class ("_OBJC_CLASS_$_");
32094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            static const llvm::StringRef g_objc_v2_prefix_metaclass ("_OBJC_METACLASS_$_");
32104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            static const llvm::StringRef g_objc_v2_prefix_ivar ("_OBJC_IVAR_$_");
32114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            if (symbol_name_ref.startswith(g_objc_v2_prefix_class))
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            {
32134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name_non_abi_mangled = symbol_name + 1;
32144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name = symbol_name + g_objc_v2_prefix_class.size();
32154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                type = eSymbolTypeObjCClass;
321601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                demangled_is_synthesized = true;
32174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            }
32184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            else if (symbol_name_ref.startswith(g_objc_v2_prefix_metaclass))
32194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            {
32204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name_non_abi_mangled = symbol_name + 1;
32214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
32224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                type = eSymbolTypeObjCMetaClass;
322301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                demangled_is_synthesized = true;
32244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            }
32254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            else if (symbol_name_ref.startswith(g_objc_v2_prefix_ivar))
32264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            {
32274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name_non_abi_mangled = symbol_name + 1;
32284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
32294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                                type = eSymbolTypeObjCIVar;
323001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                                demangled_is_synthesized = true;
323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            }
32323f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                        }
32333f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    }
32343f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    else
32354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_sect_name && ::strstr (symbol_sect_name, "__gcc_except_tab") == symbol_sect_name)
32363f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    {
32374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeException;
32383f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    }
32393f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    else
32403f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                    {
32414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        type = eSymbolTypeData;
32424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    }
32434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
32444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
32454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_sect_name && ::strstr (symbol_sect_name, "__IMPORT") == symbol_sect_name)
32464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
32474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    type = eSymbolTypeTrampoline;
32484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
32494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
32504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_section->IsDescendant(objc_section_sp.get()))
32514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
32524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    type = eSymbolTypeRuntime;
32534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (symbol_name && symbol_name[0] == '.')
32544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    {
32554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        llvm::StringRef symbol_name_ref(symbol_name);
32564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        static const llvm::StringRef g_objc_v1_prefix_class (".objc_class_name_");
32574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        if (symbol_name_ref.startswith(g_objc_v1_prefix_class))
32583f69eacbb218a37390822c89d3675bd740590382Greg Clayton                                        {
32594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name_non_abi_mangled = symbol_name;
32604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            symbol_name = symbol_name + g_objc_v1_prefix_class.size();
32614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            type = eSymbolTypeObjCClass;
326201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                            demangled_is_synthesized = true;
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        }
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
32663f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
32674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
32694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    break;
32709badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                }
32714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
32724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
32734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (add_nlist)
32744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
32754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                uint64_t symbol_value = nlist.n_value;
32763f69eacbb218a37390822c89d3675bd740590382Greg Clayton
32774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symbol_name_non_abi_mangled)
32784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
3279c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                    sym[sym_idx].GetMangled().SetMangledName (ConstString(symbol_name_non_abi_mangled));
3280c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                    sym[sym_idx].GetMangled().SetDemangledName (ConstString(symbol_name));
32814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
32824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                else
32834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
32847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                    bool symbol_name_is_mangled = false;
32857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
32864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name && symbol_name[0] == '_')
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
32884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_name_is_mangled = symbol_name[1] == '_';
32894aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_name++;  // Skip the leading underscore
32904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
32913f69eacbb218a37390822c89d3675bd740590382Greg Clayton
32924aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (symbol_name)
32934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
3294a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        ConstString const_symbol_name(symbol_name);
3295a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        sym[sym_idx].GetMangled().SetValue(const_symbol_name, symbol_name_is_mangled);
32967940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        if (is_gsym && is_debug)
32977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        {
32987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            N_GSYM_name_to_sym_idx[sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled).GetCString()] = sym_idx;
32997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                        }
3300a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                    }
3301a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                }
3302a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                if (symbol_section)
3303a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                {
3304a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                    const addr_t section_file_addr = symbol_section->GetFileAddress();
3305a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                    if (symbol_byte_size == 0 && function_starts_count > 0)
3306a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                    {
3307a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        addr_t symbol_lookup_file_addr = nlist.n_value;
3308a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        // Do an exact address match for non-ARM addresses, else get the closest since
3309a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        // the symbol might be a thumb symbol which has an address with bit zero set
3310a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        FunctionStarts::Entry *func_start_entry = function_starts.FindEntry (symbol_lookup_file_addr, !is_arm);
3311a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        if (is_arm && func_start_entry)
3312a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        {
3313a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            // Verify that the function start address is the symbol address (ARM)
3314a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            // or the symbol address + 1 (thumb)
3315a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            if (func_start_entry->addr != symbol_lookup_file_addr &&
3316a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                func_start_entry->addr != (symbol_lookup_file_addr + 1))
3317a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            {
3318a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // Not the right entry, NULL it out...
3319a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                func_start_entry = NULL;
3320a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            }
3321a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        }
3322a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        if (func_start_entry)
3323a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        {
3324a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            func_start_entry->data = true;
3325a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton
3326a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            addr_t symbol_file_addr = func_start_entry->addr;
3327a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            if (is_arm)
3328a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                symbol_file_addr &= 0xfffffffffffffffeull;
3329a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton
3330a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            const FunctionStarts::Entry *next_func_start_entry = function_starts.FindNextEntry (func_start_entry);
3331a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            const addr_t section_end_file_addr = section_file_addr + symbol_section->GetByteSize();
3332a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            if (next_func_start_entry)
3333a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            {
3334a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                addr_t next_symbol_file_addr = next_func_start_entry->addr;
3335a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // Be sure the clear the Thumb address bit when we calculate the size
3336a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // from the current and next address
3337a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                if (is_arm)
3338a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                    next_symbol_file_addr &= 0xfffffffffffffffeull;
3339a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                symbol_byte_size = std::min<lldb::addr_t>(next_symbol_file_addr - symbol_file_addr, section_end_file_addr - symbol_file_addr);
3340a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            }
3341a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            else
3342a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            {
3343a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                symbol_byte_size = section_end_file_addr - symbol_file_addr;
3344a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            }
3345a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        }
33464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
3347a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                    symbol_value -= section_file_addr;
33484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
33494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
33504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (is_debug == false)
33514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
33524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (type == eSymbolTypeCode)
33534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
33544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // See if we can find a N_FUN entry for any code symbols.
33554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // If we do find a match, and the name matches, then we
33564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // can merge the two into just the function symbol to avoid
33574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // duplicate entries in the symbol table
33584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        ValueToSymbolIndexMap::const_iterator pos = N_FUN_addr_to_sym_idx.find (nlist.n_value);
33594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (pos != N_FUN_addr_to_sym_idx.end())
33603f69eacbb218a37390822c89d3675bd740590382Greg Clayton                        {
33617940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled) == sym[pos->second].GetMangled().GetName(Mangled::ePreferMangled))
33623f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
33634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
33644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // We just need the flags from the linker symbol, so put these flags
33654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // into the N_FUN flags to avoid duplicate symbols in the symbol table
33664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
33674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].Clear();
33684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                continue;
33693f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
33704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
33714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
33724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    else if (type == eSymbolTypeData)
33734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    {
33744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // See if we can find a N_STSYM entry for any data symbols.
33754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // If we do find a match, and the name matches, then we
33764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // can merge the two into just the Static symbol to avoid
33774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        // duplicate entries in the symbol table
33784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        ValueToSymbolIndexMap::const_iterator pos = N_STSYM_addr_to_sym_idx.find (nlist.n_value);
33794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (pos != N_STSYM_addr_to_sym_idx.end())
33804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
33817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            if (sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled) == sym[pos->second].GetMangled().GetName(Mangled::ePreferMangled))
33823f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            {
33834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = pos->second;
33844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // We just need the flags from the linker symbol, so put these flags
33854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                // into the N_STSYM flags to avoid duplicate symbols in the symbol table
33864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc);
33874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].Clear();
33884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                continue;
33893f69eacbb218a37390822c89d3675bd740590382Greg Clayton                            }
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
3391a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                        else
3392d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        {
3393a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            // Combine N_GSYM stab entries with the non stab symbol
33947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                            ConstNameToSymbolIndexMap::const_iterator pos = N_GSYM_name_to_sym_idx.find(sym[sym_idx].GetMangled().GetName(Mangled::ePreferMangled).GetCString());
3395a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                            if (pos != N_GSYM_name_to_sym_idx.end())
3396d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            {
3397a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                const uint32_t GSYM_sym_idx = pos->second;
3398a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                m_nlist_idx_to_sym_idx[nlist_idx] = GSYM_sym_idx;
3399a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // Copy the address, because often the N_GSYM address has an invalid address of zero
3400a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // when the global is a common symbol
3401a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                sym[GSYM_sym_idx].GetAddress().SetSection (symbol_section);
3402a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                sym[GSYM_sym_idx].GetAddress().SetOffset (symbol_value);
3403a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // We just need the flags from the linker symbol, so put these flags
3404a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                // into the N_STSYM flags to avoid duplicate symbols in the symbol table
3405a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                sym[GSYM_sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
3406a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                sym[sym_idx].Clear();
3407a8364e966aa020af0dd0a24046f32f8f7fcc9898Greg Clayton                                continue;
3408576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                            }
3409576a68b11040d567a45dd14bc63590f1b5e0f099Greg Clayton                        }
34104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    }
34114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetID (nlist_idx);
34144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetType (type);
34154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].GetAddress().SetSection (symbol_section);
34164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].GetAddress().SetOffset (symbol_value);
34174aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc);
341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symbol_byte_size > 0)
34204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    sym[sym_idx].SetByteSize(symbol_byte_size);
34214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
342201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                if (demangled_is_synthesized)
342301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    sym[sym_idx].SetDemangledNameIsSynthesized(true);
342401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton
34254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                ++sym_idx;
34264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
34274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            else
34284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
34294aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                sym[sym_idx].Clear();
34304aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
34314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
34324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
34334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
34344aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // STAB N_GSYM entries end up having a symbol type eSymbolTypeGlobal and when the symbol value
34354aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // is zero, the address of the global ends up being in a non-STAB entry. Try and fix up all
34364aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // such entries by figuring out what the address for the global is by looking up this non-STAB
34374aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // entry and copying the value into the debug symbol's value to save us the hassle in the
34384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // debug symbol parser.
34394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton
34404aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        Symbol *global_symbol = NULL;
34414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        for (nlist_idx = 0;
34424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton             nlist_idx < symtab_load_command.nsyms && (global_symbol = symtab->FindSymbolWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, nlist_idx)) != NULL;
34434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton             nlist_idx++)
34444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
34454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (global_symbol->GetAddress().GetFileAddress() == 0)
34464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
34474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                std::vector<uint32_t> indexes;
34484aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (symtab->AppendSymbolIndexesWithName (global_symbol->GetMangled().GetName(), indexes) > 0)
34494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
34504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    std::vector<uint32_t>::const_iterator pos;
34514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    std::vector<uint32_t>::const_iterator end = indexes.end();
34524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    for (pos = indexes.begin(); pos != end; ++pos)
345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
34544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        symbol_ptr = symtab->SymbolAtIndex(*pos);
34554aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (symbol_ptr != global_symbol && symbol_ptr->IsDebug() == false)
34564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
34574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            global_symbol->GetAddress() = symbol_ptr->GetAddress();
34584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            break;
34594aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        }
346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
34624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
34634aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
34649badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
34654aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        uint32_t synthetic_sym_id = symtab_load_command.nsyms;
346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (function_starts_count > 0)
34684aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
34694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            char synthetic_function_symbol[PATH_MAX];
34704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            uint32_t num_synthetic_function_symbols = 0;
34714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            for (i=0; i<function_starts_count; ++i)
34724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
34734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (function_starts.GetEntryRef (i).data == false)
34744aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    ++num_synthetic_function_symbols;
34754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
34769badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
34774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (num_synthetic_function_symbols > 0)
34784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
34794aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                if (num_syms < sym_idx + num_synthetic_function_symbols)
34804aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
34814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    num_syms = sym_idx + num_synthetic_function_symbols;
34824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    sym = symtab->Resize (num_syms);
34834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                }
34844aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                uint32_t synthetic_function_symbol_idx = 0;
34854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                for (i=0; i<function_starts_count; ++i)
348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
34874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    const FunctionStarts::Entry *func_start_entry = function_starts.GetEntryAtIndex (i);
34884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if (func_start_entry->data == false)
348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
3490d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        addr_t symbol_file_addr = func_start_entry->addr;
3491d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        uint32_t symbol_flags = 0;
3492d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        if (is_arm)
3493d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        {
3494d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            if (symbol_file_addr & 1)
3495d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                symbol_flags = MACHO_NLIST_ARM_SYMBOL_IS_THUMB;
3496d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                            symbol_file_addr &= 0xfffffffffffffffeull;
3497d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        }
34984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        Address symbol_addr;
3499d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                        if (module_sp->ResolveFileAddress (symbol_file_addr, symbol_addr))
350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
35014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            SectionSP symbol_section (symbol_addr.GetSection());
35024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            uint32_t symbol_byte_size = 0;
35034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (symbol_section)
350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
35054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const addr_t section_file_addr = symbol_section->GetFileAddress();
35064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const FunctionStarts::Entry *next_func_start_entry = function_starts.FindNextEntry (func_start_entry);
35074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const addr_t section_end_file_addr = section_file_addr + symbol_section->GetByteSize();
35084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (next_func_start_entry)
35094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
3510d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    addr_t next_symbol_file_addr = next_func_start_entry->addr;
3511d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    if (is_arm)
3512d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                        next_symbol_file_addr &= 0xfffffffffffffffeull;
3513d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    symbol_byte_size = std::min<lldb::addr_t>(next_symbol_file_addr - symbol_file_addr, section_end_file_addr - symbol_file_addr);
35144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
35154aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                else
351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
3517d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    symbol_byte_size = section_end_file_addr - symbol_file_addr;
351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
35194aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                snprintf (synthetic_function_symbol,
35204aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          sizeof(synthetic_function_symbol),
35214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          "___lldb_unnamed_function%u$$%s",
35224aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          ++synthetic_function_symbol_idx,
35234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                          module_sp->GetFileSpec().GetFilename().GetCString());
35244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].SetID (synthetic_sym_id++);
3525c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                                sym[sym_idx].GetMangled().SetDemangledName(ConstString(synthetic_function_symbol));
35264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].SetType (eSymbolTypeCode);
35274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].SetIsSynthetic (true);
35284aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                sym[sym_idx].GetAddress() = symbol_addr;
3529d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                if (symbol_flags)
3530d2653c29ee7023d7bc2b504267169bbad68d988bGreg Clayton                                    sym[sym_idx].SetFlags (symbol_flags);
35314aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (symbol_byte_size)
35324aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    sym[sym_idx].SetByteSize (symbol_byte_size);
35334aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                ++sym_idx;
353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
35384aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            }
35394aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
3540637029b85196806ce0f39271764efae43c888e85Greg Clayton
35414aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // Trim our symbols down to just what we ended up with after
35424aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // removing any symbols.
35434aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (sym_idx < num_syms)
35444aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
35454aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            num_syms = sym_idx;
35464aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            sym = symtab->Resize (num_syms);
35474aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        }
3548637029b85196806ce0f39271764efae43c888e85Greg Clayton
35494aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        // Now synthesize indirect symbols
35504aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        if (m_dysymtab.nindirectsyms != 0)
35514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        {
35524aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            if (indirect_symbol_index_data.GetByteSize())
35534aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton            {
35544aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                NListIndexToSymbolIndexMap::const_iterator end_index_pos = m_nlist_idx_to_sym_idx.end();
355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35564aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                for (uint32_t sect_idx = 1; sect_idx < m_mach_sections.size(); ++sect_idx)
35574aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                {
35584aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                    if ((m_mach_sections[sect_idx].flags & SectionFlagMaskSectionType) == SectionTypeSymbolStubs)
355924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
35604aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        uint32_t symbol_stub_byte_size = m_mach_sections[sect_idx].reserved2;
35614aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (symbol_stub_byte_size == 0)
35624aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            continue;
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35644aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        const uint32_t num_symbol_stubs = m_mach_sections[sect_idx].size / symbol_stub_byte_size;
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35664aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        if (num_symbol_stubs == 0)
35674aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            continue;
356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35694aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        const uint32_t symbol_stub_index_offset = m_mach_sections[sect_idx].reserved1;
35704aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        for (uint32_t stub_idx = 0; stub_idx < num_symbol_stubs; ++stub_idx)
35714aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                        {
35724aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const uint32_t symbol_stub_index = symbol_stub_index_offset + stub_idx;
35734aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            const lldb::addr_t symbol_stub_addr = m_mach_sections[sect_idx].addr + (stub_idx * symbol_stub_byte_size);
357436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                            lldb::offset_t symbol_stub_offset = symbol_stub_index * 4;
35754aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            if (indirect_symbol_index_data.ValidOffsetForDataOfSize(symbol_stub_offset, 4))
35764aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                            {
35774aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                const uint32_t stub_sym_id = indirect_symbol_index_data.GetU32 (&symbol_stub_offset);
35784aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (stub_sym_id & (IndirectSymbolAbsolute | IndirectSymbolLocal))
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    continue;
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35814aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                NListIndexToSymbolIndexMap::const_iterator index_pos = m_nlist_idx_to_sym_idx.find (stub_sym_id);
35824aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                Symbol *stub_symbol = NULL;
35834aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (index_pos != end_index_pos)
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
35854aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // We have a remapping from the original nlist index to
35864aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // a current symbol index, so just look this up by index
35874aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    stub_symbol = symtab->SymbolAtIndex (index_pos->second);
35884aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
35899badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                else
35904aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
35914aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // We need to lookup a symbol using the original nlist
35929badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                    // symbol index since this index is coming from the
35934aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    // S_SYMBOL_STUBS
35944aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    stub_symbol = symtab->FindSymbolByID (stub_sym_id);
35954aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                }
35960ad086f3ab18d6927b9df2f79169607d3a5d90e4Greg Clayton
35974aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                if (stub_symbol)
35984aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                {
35994aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    Address so_addr(symbol_stub_addr, section_list);
360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36014aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    if (stub_symbol->GetType() == eSymbolTypeUndefined)
36024aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    {
36034aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // Change the external symbol into a trampoline that makes sense
36044aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // These symbols were N_UNDF N_EXT, and are useless to us, so we
36054aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // can re-use them so we don't have to make up a synthetic symbol
36064aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // for no good reason.
36074aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->SetType (eSymbolTypeTrampoline);
36084aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->SetExternal (false);
36094aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->GetAddress() = so_addr;
36104aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        stub_symbol->SetByteSize (symbol_stub_byte_size);
36114aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    }
36124aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    else
36134aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                    {
36144aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        // Make a synthetic symbol to describe the trampoline stub
36152a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        Mangled stub_symbol_mangled_name(stub_symbol->GetMangled());
36164aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        if (sym_idx >= num_syms)
36172a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        {
36184aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                            sym = symtab->Resize (++num_syms);
36192a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                            stub_symbol = NULL;  // this pointer no longer valid
36202a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        }
36214aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetID (synthetic_sym_id++);
36222a76fbf9ca189aa2269ad8382ed07f68062fa2e4Jason Molenda                                        sym[sym_idx].GetMangled() = stub_symbol_mangled_name;
36234aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetType (eSymbolTypeTrampoline);
36244aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetIsSynthetic (true);
36254aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].GetAddress() = so_addr;
36264aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        sym[sym_idx].SetByteSize (symbol_stub_byte_size);
36274aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton                                        ++sym_idx;
362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
3630d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton                                else
3631d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton                                {
3632d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton                                    if (log)
3633d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton                                        log->Warning ("symbol stub referencing symbol table symbol %u that isn't in our minimal symbol table, fix this!!!", stub_sym_id);
3634d4330e6663781f12e0bf206b8323c672f0189b02Greg Clayton                                }
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
36417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
36427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        StreamFile s(stdout, false);
36437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        s.Printf ("Symbol table before CalculateSymbolSizes():\n");
36447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        symtab->Dump(&s, NULL, eSortOrderNone);
36457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        // Set symbol byte sizes correctly since mach-o nlist entries don't have sizes
36467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        symtab->CalculateSymbolSizes();
36477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
36487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        s.Printf ("Symbol table after CalculateSymbolSizes():\n");
36497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton//        symtab->Dump(&s, NULL, eSortOrderNone);
36507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
36514aa2edf602fa60693afa33d4fe0d1d459a488333Greg Clayton        return symtab->GetNumSymbols();
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::Dump (Stream *s)
365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
36619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
36629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    {
36639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
36649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->Printf("%p: ", this);
36659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        s->Indent();
36669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_header.magic == HeaderMagic64 || m_header.magic == HeaderMagic64Swapped)
36679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            s->PutCString("ObjectFileMachO64");
36689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        else
36699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            s->PutCString("ObjectFileMachO32");
367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n";
367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        SectionList *sections = GetSectionList();
36767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        if (sections)
36777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            sections->Dump(s, NULL, true, UINT32_MAX);
367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_symtab_ap.get())
36809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_symtab_ap->Dump(s, NULL, eSortOrderNone);
36819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    }
368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
368436b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonbool
368536b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFileMachO::GetUUID (const llvm::MachO::mach_header &header,
368636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                          const lldb_private::DataExtractor &data,
368736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                          lldb::offset_t lc_offset,
368836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                          lldb_private::UUID& uuid)
368936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{
369036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    uint32_t i;
369136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    struct uuid_command load_cmd;
369236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
369336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    lldb::offset_t offset = lc_offset;
369436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    for (i=0; i<header.ncmds; ++i)
369536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
369636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        const lldb::offset_t cmd_offset = offset;
369736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        if (data.GetU32(&offset, &load_cmd, 2) == NULL)
369836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            break;
369936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
370036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        if (load_cmd.cmd == LoadCommandUUID)
370136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        {
370236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            const uint8_t *uuid_bytes = data.PeekData(offset, 16);
370336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
370436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            if (uuid_bytes)
370536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            {
370636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                // OpenCL on Mac OS X uses the same UUID for each of its object files.
370736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                // We pretend these object files have no UUID to prevent crashing.
370836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
370936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                const uint8_t opencl_uuid[] = { 0x8c, 0x8e, 0xb3, 0x9b,
371036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    0x3b, 0xa8,
371136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    0x4b, 0x16,
371236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    0xb6, 0xa4,
371336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    0x27, 0x63, 0xbb, 0x14, 0xf0, 0x0d };
371436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
371536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                if (!memcmp(uuid_bytes, opencl_uuid, 16))
371636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                    return false;
371736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
371836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                uuid.SetBytes (uuid_bytes);
371936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton                return true;
372036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            }
372136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            return false;
372236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        }
372336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        offset = cmd_offset + load_cmd.cmdsize;
372436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
372536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    return false;
372636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton}
372724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
37290467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg ClaytonObjectFileMachO::GetUUID (lldb_private::UUID* uuid)
373024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
37329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
373536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
373636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        return GetUUID (m_header, m_data, offset, *uuid);
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetDependentModules (FileSpecList& files)
374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
37469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
37479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
37509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct load_command load_cmd;
375136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
37529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        const bool resolve_path = false; // Don't resolve the dependend file paths since they may not reside on this system
37539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
37549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            const uint32_t cmd_offset = offset;
37579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
37589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
37599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
37609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            switch (load_cmd.cmd)
376124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
37629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibLoad:
37639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibLoadWeak:
37649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibReexport:
37659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDynamicLinkerLoad:
37669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandFixedVMShlibLoad:
37679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandDylibLoadUpward:
376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
37699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    uint32_t name_offset = cmd_offset + m_data.GetU32(&offset);
37709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    const char *path = m_data.PeekCStr(name_offset);
37719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // Skip any path that starts with '@' since these are usually:
37729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // @executable_path/.../file
37739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    // @rpath/.../file
37749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (path && path[0] != '@')
37759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
37769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        FileSpec file_spec(path, resolve_path);
37779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (files.AppendIfUnique(file_spec))
37789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            count++;
37799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
37819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37839482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            default:
37849482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
37859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
37869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
378724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
378824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
378924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return count;
379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
379124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37922877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Inghamlldb_private::Address
37939badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason MolendaObjectFileMachO::GetEntryPointAddress ()
37942877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham{
37952877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // If the object file is not an executable it can't hold the entry point.  m_entry_point_address
37962877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // is initialized to an invalid address, so we can just return that.
37972877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // If m_entry_point_address is valid it means we've found it already, so return the cached value.
37989badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
37992877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    if (!IsExecutable() || m_entry_point_address.IsValid())
38002877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        return m_entry_point_address;
38019badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
38029badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda    // Otherwise, look for the UnixThread or Thread command.  The data for the Thread command is given in
38032877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // /usr/include/mach-o.h, but it is basically:
38042877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
38052877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  uint32_t flavor  - this is the flavor argument you would pass to thread_get_state
38062877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  uint32_t count   - this is the count of longs in the thread state data
38072877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  struct XXX_thread_state state - this is the structure from <machine/thread_status.h> corresponding to the flavor.
38082877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //  <repeat this trio>
38099badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda    //
38102877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // So we just keep reading the various register flavors till we find the GPR one, then read the PC out of there.
38112877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // FIXME: We will need to have a "RegisterContext data provider" class at some point that can get all the registers
38122877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // out of data in this form & attach them to a given thread.  That should underlie the MacOS X User process plugin,
38132877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim 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.
38142877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
38152877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    // For now we hard-code the offsets and flavors we need:
38162877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
38172877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    //
38182877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
38199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
38209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
38212877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    {
38229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
38239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct load_command load_cmd;
382436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
38259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
38269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb::addr_t start_address = LLDB_INVALID_ADDRESS;
38279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        bool done = false;
38289badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
38299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
38302877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        {
383136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            const lldb::offset_t cmd_offset = offset;
38329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
38339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
38349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
38359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            switch (load_cmd.cmd)
38362877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham            {
38379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandUnixThread:
38389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandThread:
38392877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                {
38409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    while (offset < cmd_offset + load_cmd.cmdsize)
38412877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                    {
38429482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        uint32_t flavor = m_data.GetU32(&offset);
38439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        uint32_t count = m_data.GetU32(&offset);
38449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (count == 0)
38459482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        {
38469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            // We've gotten off somehow, log and exit;
38479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            return m_entry_point_address;
38482877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                        }
38499badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
38509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        switch (m_header.cputype)
38519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        {
38529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        case llvm::MachO::CPUTypeARM:
38539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           if (flavor == 1) // ARM_THREAD_STATE from mach/arm/thread_status.h
38549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           {
38559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               offset += 60;  // This is the offset of pc in the GPR thread state data structure.
38569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               start_address = m_data.GetU32(&offset);
38579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               done = true;
38589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            }
38599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
38609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        case llvm::MachO::CPUTypeI386:
38619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           if (flavor == 1) // x86_THREAD_STATE32 from mach/i386/thread_status.h
38629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           {
38639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               offset += 40;  // This is the offset of eip in the GPR thread state data structure.
38649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               start_address = m_data.GetU32(&offset);
38659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               done = true;
38669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            }
38679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
38689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        case llvm::MachO::CPUTypeX86_64:
38699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           if (flavor == 4) // x86_THREAD_STATE64 from mach/i386/thread_status.h
38709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                           {
38719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               offset += 16 * 8;  // This is the offset of rip in the GPR thread state data structure.
38729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               start_address = m_data.GetU64(&offset);
38739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                               done = true;
38749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            }
38759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
38769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        default:
38779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            return m_entry_point_address;
38782877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                        }
38799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        // Haven't found the GPR flavor yet, skip over the data for this flavor:
38809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        if (done)
38819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                            break;
38829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        offset += count * 4;
38832877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                    }
38842877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham                }
38859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
38869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            case LoadCommandMain:
38876e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan                {
38889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    ConstString text_segment_name ("__TEXT");
38899482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    uint64_t entryoffset = m_data.GetU64(&offset);
38909482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    SectionSP text_segment_sp = GetSectionList()->FindSectionByName(text_segment_name);
38919482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (text_segment_sp)
38929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    {
38939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        done = true;
38949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        start_address = text_segment_sp->GetFileAddress() + entryoffset;
38959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    }
38966e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan                }
38979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
38989482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            default:
38999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
39006e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            }
39019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (done)
39029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
39032877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
39049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // Go to the next load command:
39059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
39062877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        }
39079badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
39089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (start_address != LLDB_INVALID_ADDRESS)
39092877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        {
39109badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda            // We got the start address from the load commands, so now resolve that address in the sections
39119482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // of this ObjectFile:
39129482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (!m_entry_point_address.ResolveAddressUsingFileSections (start_address, GetSectionList()))
39139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            {
39149482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                m_entry_point_address.Clear();
39159482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
39162877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham        }
39179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        else
39183508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        {
39199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // We couldn't read the UnixThread load command - maybe it wasn't there.  As a fallback look for the
39209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // "start" symbol in the main executable.
39219badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
39229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            ModuleSP module_sp (GetModule());
39239badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
39249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (module_sp)
39253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            {
39269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                SymbolContextList contexts;
39279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                SymbolContext context;
39289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (module_sp->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts))
39299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
39309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (contexts.GetContextAtIndex(0, context))
39319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        m_entry_point_address = context.symbol->GetAddress();
39329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
39333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            }
39343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        }
39352877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    }
39369badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
39372877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham    return m_entry_point_address;
39382877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
39392877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham}
39402877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham
3941b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonlldb_private::Address
3942b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileMachO::GetHeaderAddress ()
3943b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
3944b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    lldb_private::Address header_addr;
3945b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    SectionList *section_list = GetSectionList();
3946b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (section_list)
3947b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
3948b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        SectionSP text_segment_sp (section_list->FindSectionByName (GetSegmentNameTEXT()));
3949b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (text_segment_sp)
3950b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
39513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            header_addr.SetSection (text_segment_sp);
3952b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            header_addr.SetOffset (0);
3953b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
3954b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
3955b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return header_addr;
3956b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
3957b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
395846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonuint32_t
395946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonObjectFileMachO::GetNumThreadContexts ()
396046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
39619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
39629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
396346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
39649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
39659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (!m_thread_context_offsets_valid)
396646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
39679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            m_thread_context_offsets_valid = true;
396836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
39699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            FileRangeArray::Entry file_range;
39709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            thread_command thread_cmd;
39719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            for (uint32_t i=0; i<m_header.ncmds; ++i)
397246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
39739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                const uint32_t cmd_offset = offset;
39749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (m_data.GetU32(&offset, &thread_cmd, 2) == NULL)
39759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    break;
39769badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
39779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (thread_cmd.cmd == LoadCommandThread)
39789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
39799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    file_range.SetRangeBase (offset);
39809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    file_range.SetByteSize (thread_cmd.cmdsize - 8);
39819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    m_thread_context_offsets.Append (file_range);
39829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
39839482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                offset = cmd_offset + thread_cmd.cmdsize;
398446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
398546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
398646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
398746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return m_thread_context_offsets.GetSize();
398846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
398946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
399046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::RegisterContextSP
399146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonObjectFileMachO::GetThreadContextAtIndex (uint32_t idx, lldb_private::Thread &thread)
399246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
399346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    lldb::RegisterContextSP reg_ctx_sp;
39949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
39959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
39969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
399746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
39989482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
39999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (!m_thread_context_offsets_valid)
40009482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            GetNumThreadContexts ();
40019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
40029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        const FileRangeArray::Entry *thread_context_file_range = m_thread_context_offsets.GetEntryAtIndex (idx);
40036f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        if (thread_context_file_range)
40046f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        {
40059badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
40069badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda            DataExtractor data (m_data,
40079badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                                thread_context_file_range->GetRangeBase(),
40086f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                                thread_context_file_range->GetByteSize());
40099482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton
40106f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            switch (m_header.cputype)
40116f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            {
40126f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                case llvm::MachO::CPUTypeARM:
40136f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                    reg_ctx_sp.reset (new RegisterContextDarwin_arm_Mach (thread, data));
40146f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                    break;
40159badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
40166f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                case llvm::MachO::CPUTypeI386:
40176f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                    reg_ctx_sp.reset (new RegisterContextDarwin_i386_Mach (thread, data));
40186f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                    break;
40199badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
40206f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                case llvm::MachO::CPUTypeX86_64:
40216f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                    reg_ctx_sp.reset (new RegisterContextDarwin_x86_64_Mach (thread, data));
40226f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                    break;
40236f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            }
40249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
402546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
402646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return reg_ctx_sp;
402746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
402846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
4029b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
4030ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFile::Type
4031ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFileMachO::CalculateType()
4032ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton{
4033ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    switch (m_header.filetype)
4034ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    {
4035ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeObject:                                          // 0x1u MH_OBJECT
4036ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            if (GetAddressByteSize () == 4)
4037ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            {
4038ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // 32 bit kexts are just object files, but they do have a valid
4039ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // UUID load command.
4040ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                UUID uuid;
4041ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                if (GetUUID(&uuid))
4042ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                {
4043ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // this checking for the UUID load command is not enough
40449badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                    // we could eventually look for the symbol named
4045ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // "OSKextGetCurrentIdentifier" as this is required of kexts
4046ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    if (m_strata == eStrataInvalid)
4047ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                        m_strata = eStrataKernel;
4048ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    return eTypeSharedLibrary;
4049ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                }
4050ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            }
4051ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            return eTypeObjectFile;
4052ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
4053ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeExecutable:          return eTypeExecutable;     // 0x2u MH_EXECUTE
4054ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeFixedVMShlib:        return eTypeSharedLibrary;  // 0x3u MH_FVMLIB
4055ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeCore:                return eTypeCoreFile;       // 0x4u MH_CORE
4056ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypePreloadedExecutable: return eTypeSharedLibrary;  // 0x5u MH_PRELOAD
4057ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlib:        return eTypeSharedLibrary;  // 0x6u MH_DYLIB
4058ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicLinkEditor:   return eTypeDynamicLinker;  // 0x7u MH_DYLINKER
4059ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeBundle:              return eTypeSharedLibrary;  // 0x8u MH_BUNDLE
4060ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlibStub:    return eTypeStubLibrary;    // 0x9u MH_DYLIB_STUB
4061ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDSYM:                return eTypeDebugInfo;      // 0xAu MH_DSYM
4062ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeKextBundle:          return eTypeSharedLibrary;  // 0xBu MH_KEXT_BUNDLE
4063ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        default:
4064ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            break;
4065ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    }
4066ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    return eTypeUnknown;
4067ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton}
4068ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
4069ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFile::Strata
4070ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFileMachO::CalculateStrata()
4071ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton{
4072ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    switch (m_header.filetype)
4073ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    {
4074ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeObject:      // 0x1u MH_OBJECT
4075ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            {
4076ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // 32 bit kexts are just object files, but they do have a valid
4077ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                // UUID load command.
4078ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                UUID uuid;
4079ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                if (GetUUID(&uuid))
4080ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                {
4081ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // this checking for the UUID load command is not enough
40829badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                    // we could eventually look for the symbol named
4083ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    // "OSKextGetCurrentIdentifier" as this is required of kexts
4084ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    if (m_type == eTypeInvalid)
4085ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                        m_type = eTypeSharedLibrary;
4086ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
4087ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                    return eStrataKernel;
4088ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                }
4089ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            }
4090ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            return eStrataUnknown;
4091ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
4092ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeExecutable:                                     // 0x2u MH_EXECUTE
4093ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            // Check for the MH_DYLDLINK bit in the flags
4094ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            if (m_header.flags & HeaderFlagBitIsDynamicLinkObject)
4095ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            {
4096ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton                return eStrataUser;
4097ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            }
40989badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda            else
4099ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            {
4100ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                SectionList *section_list = GetSectionList();
4101ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                if (section_list)
4102ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                {
4103ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                    static ConstString g_kld_section_name ("__KLD");
4104ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                    if (section_list->FindSectionByName(g_kld_section_name))
4105ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                        return eStrataKernel;
4106ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                }
4107ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            }
4108ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan            return eStrataRawImage;
4109ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
4110ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeFixedVMShlib:        return eStrataUser;         // 0x3u MH_FVMLIB
4111ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeCore:                return eStrataUnknown;      // 0x4u MH_CORE
4112ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan        case HeaderFileTypePreloadedExecutable: return eStrataRawImage;     // 0x5u MH_PRELOAD
4113ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlib:        return eStrataUser;         // 0x6u MH_DYLIB
4114ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicLinkEditor:   return eStrataUser;         // 0x7u MH_DYLINKER
4115ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeBundle:              return eStrataUser;         // 0x8u MH_BUNDLE
4116ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDynamicShlibStub:    return eStrataUser;         // 0x9u MH_DYLIB_STUB
4117ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeDSYM:                return eStrataUnknown;      // 0xAu MH_DSYM
4118ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        case HeaderFileTypeKextBundle:          return eStrataKernel;       // 0xBu MH_KEXT_BUNDLE
4119ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton        default:
4120ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton            break;
4121ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    }
4122ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton    return eStrataUnknown;
4123ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton}
4124ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
4125ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton
412649f4bf21e0fb7675d67f95dafe66a098d3205650Greg Claytonuint32_t
412749f4bf21e0fb7675d67f95dafe66a098d3205650Greg ClaytonObjectFileMachO::GetVersion (uint32_t *versions, uint32_t num_versions)
412849f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton{
41299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
41309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
413149f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton    {
41329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
41339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        struct dylib_command load_cmd;
413436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
41359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t version_cmd = 0;
41369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint64_t version = 0;
41379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        uint32_t i;
41389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        for (i=0; i<m_header.ncmds; ++i)
413949f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        {
414036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            const lldb::offset_t cmd_offset = offset;
41419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (m_data.GetU32(&offset, &load_cmd, 2) == NULL)
41429482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                break;
41439badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
41449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (load_cmd.cmd == LoadCommandDylibIdent)
414549f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton            {
41469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (version_cmd == 0)
41479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                {
41489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    version_cmd = load_cmd.cmd;
41499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    if (m_data.GetU32(&offset, &load_cmd.dylib, 4) == NULL)
41509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                        break;
41519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    version = load_cmd.dylib.current_version;
41529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                }
41539badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda                break; // Break for now unless there is another more complete version
41549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                       // number load command in the future.
415549f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton            }
41569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            offset = cmd_offset + load_cmd.cmdsize;
415749f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        }
41589badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
41599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (version_cmd == LoadCommandDylibIdent)
416049f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        {
41619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            if (versions != NULL && num_versions > 0)
41629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            {
41639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (num_versions > 0)
41649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[0] = (version & 0xFFFF0000ull) >> 16;
41659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (num_versions > 1)
41669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[1] = (version & 0x0000FF00ull) >> 8;
41679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                if (num_versions > 2)
41689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[2] = (version & 0x000000FFull);
41699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                // Fill in an remaining version numbers with invalid values
41709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                for (i=3; i<num_versions; ++i)
41719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton                    versions[i] = UINT32_MAX;
41729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            }
41739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // The LC_ID_DYLIB load command has a version with 3 version numbers
41749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            // in it, so always return 3
41759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            return 3;
417649f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton        }
417749f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton    }
417849f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton    return false;
417949f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton}
418049f4bf21e0fb7675d67f95dafe66a098d3205650Greg Clayton
418124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4182395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonObjectFileMachO::GetArchitecture (ArchSpec &arch)
418324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41849482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    ModuleSP module_sp(GetModule());
41859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    if (module_sp)
41866a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton    {
41879482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
41889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        arch.SetArchitecture (eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
41899badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda
41909482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // Files with type MH_PRELOAD are currently used in cases where the image
41919badb6c001eb6cfa8135aab4f1ce19f5efd0fdd6Jason Molenda        // debugs at the addresses in the file itself. Below we set the OS to
41929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        // unknown to make sure we use the DynamicLoaderStatic()...
41939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        if (m_header.filetype == HeaderFileTypePreloadedExecutable)
41949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        {
41959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton            arch.GetTriple().setOS (llvm::Triple::UnknownOS);
41969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        }
41979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton        return true;
41986a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton    }
41999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton    return false;
420024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
420124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
420224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
420345c7550007ce13ecac458f2e7a7849a996b166b7Jason MolendaUUID
420445c7550007ce13ecac458f2e7a7849a996b166b7Jason MolendaObjectFileMachO::GetProcessSharedCacheUUID (Process *process)
420545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda{
420645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    UUID uuid;
420745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    if (process)
420845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    {
420945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        addr_t all_image_infos = process->GetImageInfoAddress();
421045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
421145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        // The address returned by GetImageInfoAddress may be the address of dyld (don't want)
421245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        // or it may be the address of the dyld_all_image_infos structure (want).  The first four
421345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        // bytes will be either the version field (all_image_infos) or a Mach-O file magic constant.
421445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        // Version 13 and higher of dyld_all_image_infos is required to get the sharedCacheUUID field.
421545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
421645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        Error err;
421745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        uint32_t version_or_magic = process->ReadUnsignedIntegerFromMemory (all_image_infos, 4, -1, err);
421845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        if (version_or_magic != -1
421945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            && version_or_magic != HeaderMagic32
422045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            && version_or_magic != HeaderMagic32Swapped
422145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            && version_or_magic != HeaderMagic64
422245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            && version_or_magic != HeaderMagic64Swapped
422345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            && version_or_magic >= 13)
422445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        {
422545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            addr_t sharedCacheUUID_address = LLDB_INVALID_ADDRESS;
422645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            int wordsize = process->GetAddressByteSize();
422745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            if (wordsize == 8)
422845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            {
422945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                sharedCacheUUID_address = all_image_infos + 160;  // sharedCacheUUID <mach-o/dyld_images.h>
423045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            }
423145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            if (wordsize == 4)
423245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            {
423345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                sharedCacheUUID_address = all_image_infos + 84;   // sharedCacheUUID <mach-o/dyld_images.h>
423445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            }
423545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            if (sharedCacheUUID_address != LLDB_INVALID_ADDRESS)
423645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            {
423745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                uuid_t shared_cache_uuid;
423845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                if (process->ReadMemory (sharedCacheUUID_address, shared_cache_uuid, sizeof (uuid_t), err) == sizeof (uuid_t))
423945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                {
424045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                    uuid.SetBytes (shared_cache_uuid);
424145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                }
424245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            }
424345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        }
424445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    }
424545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    return uuid;
424645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda}
424745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
424845c7550007ce13ecac458f2e7a7849a996b166b7Jason MolendaUUID
424945c7550007ce13ecac458f2e7a7849a996b166b7Jason MolendaObjectFileMachO::GetLLDBSharedCacheUUID ()
425045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda{
425145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    UUID uuid;
425245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda#if defined (__APPLE__) && defined (__arm__)
425345c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    uint8_t *(*dyld_get_all_image_infos)(void);
425445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    dyld_get_all_image_infos = (uint8_t*(*)()) dlsym (RTLD_DEFAULT, "_dyld_get_all_image_infos");
425545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    if (dyld_get_all_image_infos)
425645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    {
425745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        uint8_t *dyld_all_image_infos_address = dyld_get_all_image_infos();
425845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        if (dyld_all_image_infos_address)
425945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        {
42606ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda            uint32_t *version = (uint32_t*) dyld_all_image_infos_address;              // version <mach-o/dyld_images.h>
42616ff916f55c8550f2f8199b130ae6b4a99dd205fbJason Molenda            if (*version >= 13)
426245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            {
42632ceae99039da9adb5ef56584be8b300388e98524Jason Molenda                uuid_t *sharedCacheUUID_address = (uuid_t*) ((uint8_t*) dyld_all_image_infos_address + 84);  // sharedCacheUUID <mach-o/dyld_images.h>
426445c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda                uuid.SetBytes (sharedCacheUUID_address);
426545c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda            }
426645c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda        }
426745c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    }
426845c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda#endif
426945c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda    return uuid;
427045c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda}
427145c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
427245c7550007ce13ecac458f2e7a7849a996b166b7Jason Molenda
427324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
427424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
427524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
42760e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
427724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginName()
427824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
427924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
428024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
428224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
428324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileMachO::GetPluginVersion()
428424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
428524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
428624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
428724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4288