Index: lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml =================================================================== --- lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml +++ lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml @@ -0,0 +1,47 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000002 + ncmds: 9 + sizeofcmds: 520 + flags: 0x00000085 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __PAGEZERO + vmaddr: 0 + vmsize: 4294967296 + fileoff: 0 + filesize: 0 + maxprot: 0 + initprot: 0 + nsects: 0 + flags: 0 + - cmd: LC_SEGMENT_64 + cmdsize: 152 + segname: __TEXT + vmaddr: 4294967296 + vmsize: 4096 + fileoff: 0 + filesize: 4096 + maxprot: 7 + initprot: 5 + nsects: 1 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000100000FF0 + size: 6 + offset: 0x00000FF0 + align: 4 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 +... Index: lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms =================================================================== --- lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms +++ lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms @@ -0,0 +1,2 @@ +MODULE mac x86_64 601705B3B1227B7D39F9240E077D625B0 mac.out +PUBLIC ff0 0 _start Index: lit/SymbolFile/Breakpad/symtab-macho.test =================================================================== --- lit/SymbolFile/Breakpad/symtab-macho.test +++ lit/SymbolFile/Breakpad/symtab-macho.test @@ -0,0 +1,21 @@ +# RUN: yaml2obj %S/Inputs/basic-macho.yaml > %T/symtab-macho.out +# RUN: %lldb %T/symtab-macho.out -o "target symbols add -s symtab-macho.out %S/Inputs/symtab-macho.syms" \ +# RUN: -s %s | FileCheck %s + +image dump symtab symtab-macho.out +# CHECK-LABEL: (lldb) image dump symtab symtab-macho.out +# CHECK: Symtab, file = {{.*}}symtab-macho.out, num_symbols = 1: +# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name +# CHECK: [ 0] 0 X Code 0x0000000100000ff0 0x0000000000000006 0x00000000 _start + +# CHECK-LABEL: (lldb) image lookup -a 0x100000ff0 -v +# CHECK: Address: symtab-macho.out[0x0000000100000ff0] (symtab-macho.out.__TEXT.__text + 0) +# CHECK: Symbol: id = {0x00000000}, range = [0x0000000100000ff0-0x0000000100000ff6), name="_start" + +# CHECK-LABEL: (lldb) image lookup -n _start -v +# CHECK: Address: symtab-macho.out[0x0000000100000ff0] (symtab-macho.out.__TEXT.__text + 0) +# CHECK: Symbol: id = {0x00000000}, range = [0x0000000100000ff0-0x0000000100000ff6), name="_start" + +image lookup -a 0x100000ff0 -v +image lookup -n _start -v +exit Index: source/Symbol/SymbolVendor.cpp =================================================================== --- source/Symbol/SymbolVendor.cpp +++ source/Symbol/SymbolVendor.cpp @@ -43,12 +43,19 @@ } // The default implementation just tries to create debug information using // the file representation for the module. - instance_ap.reset(new SymbolVendor(module_sp)); - if (instance_ap.get()) { - ObjectFile *objfile = module_sp->GetObjectFile(); - if (objfile) - instance_ap->AddSymbolFileRepresentation(objfile->shared_from_this()); + ObjectFileSP sym_objfile_sp; + FileSpec sym_spec = module_sp->GetSymbolFileFileSpec(); + if (sym_spec && sym_spec != module_sp->GetObjectFile()->GetFileSpec()) { + DataBufferSP data_sp; + offset_t data_offset = 0; + sym_objfile_sp = ObjectFile::FindPlugin( + module_sp, &sym_spec, 0, FileSystem::Instance().GetByteSize(sym_spec), + data_sp, data_offset); } + if (!sym_objfile_sp) + sym_objfile_sp = module_sp->GetObjectFile()->shared_from_this(); + instance_ap.reset(new SymbolVendor(module_sp)); + instance_ap->AddSymbolFileRepresentation(sym_objfile_sp); return instance_ap.release(); }