summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Labath <pavel@labath.sk>2019-01-16 12:42:57 +0000
committerPavel Labath <pavel@labath.sk>2019-01-16 12:42:57 +0000
commitdd487d65211d919873beeca3206a8b9401a710a1 (patch)
tree77913e031e33bea6b8aaffcf80a159233b6edf8e
parent9feeaa933e918fc1a2fabf3b49886ca433c68598 (diff)
downloadbcm5719-llvm-dd487d65211d919873beeca3206a8b9401a710a1.tar.gz
bcm5719-llvm-dd487d65211d919873beeca3206a8b9401a710a1.zip
Teach the default symbol vendor to respect module.GetSymbolFileFileSpec()
Summary: Adding a breakpad symbol file to an existing MachO module with "target symbols add" currently works only if one's host platform is a mac. This is because SymbolVendorMacOSX (which is the one responsible for loading symbols for MachO files) is conditionally compiled for the mac platform. While we will sooner or later have a special symbol vendor for breakpad files (to enable more advanced searching), and so this flow could be made to work through that, it's not clear to me whether this should be a requirement for the "target symbols add" flow to work. After all, since the user has explicitly specified the symbol file to use, the symbol vendor plugin's job is pretty much done. This patch teaches the default symbol vendor to respect module's symbol file spec, and load the symbol from that file if it is specified (and no plugin requests any special handling). Reviewers: clayborg, zturner, lemo Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D56589 llvm-svn: 351330
-rw-r--r--lldb/lit/SymbolFile/Breakpad/Inputs/basic-macho.yaml47
-rw-r--r--lldb/lit/SymbolFile/Breakpad/Inputs/symtab-macho.syms2
-rw-r--r--lldb/lit/SymbolFile/Breakpad/symtab-macho.test21
-rw-r--r--lldb/source/Symbol/SymbolVendor.cpp17
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();
}
OpenPOWER on IntegriCloud