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