diff options
-rw-r--r-- | lldb/lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml | 47 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms | 2 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/Breakpad/symtab-macho.test | 21 | ||||
-rw-r--r-- | lldb/source/Symbol/SymbolVendor.cpp | 17 |
4 files changed, 82 insertions, 5 deletions
diff --git a/lldb/lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml b/lldb/lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml new file mode 100644 index 00000000000..0e2ae1c04f1 --- /dev/null +++ b/lldb/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 +... diff --git a/lldb/lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms b/lldb/lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms new file mode 100644 index 00000000000..6dc8904ed23 --- /dev/null +++ b/lldb/lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms @@ -0,0 +1,2 @@ +MODULE mac x86_64 601705B3B1227B7D39F9240E077D625B0 mac.out +PUBLIC ff0 0 _start diff --git a/lldb/lit/SymbolFile/Breakpad/symtab-macho.test b/lldb/lit/SymbolFile/Breakpad/symtab-macho.test new file mode 100644 index 00000000000..eef417733d3 --- /dev/null +++ b/lldb/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 diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp index a9badc15a5d..94bdf26d76b 100644 --- a/lldb/source/Symbol/SymbolVendor.cpp +++ b/lldb/source/Symbol/SymbolVendor.cpp @@ -43,12 +43,19 @@ SymbolVendor *SymbolVendor::FindPlugin(const lldb::ModuleSP &module_sp, } // 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(); } |