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 (§64, 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, §64.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