Recommit "Teach the default symbol vendor to respect module.GetSymbolFileFileSpec()"

This reapplies commit r351330, which was reverted due to a failing test on
macos. The failure was because the SymbolVendor used on MacOS was stricter than
the default (or ELF) symbol vendor, and rejected the symbol file because it's
UUID did not match the object file.

This version of the patch adds a uuid load command to the test macho file to
make sure the UUIDs match.

llvm-svn: 351447
This commit is contained in:
Pavel Labath 2019-01-17 15:07:35 +00:00
parent 35ab86df62
commit 7630e0bcbe
4 changed files with 85 additions and 5 deletions

View File

@ -0,0 +1,50 @@
--- !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
- cmd: LC_UUID
cmdsize: 24
uuid: B3051760-22B1-7D7B-39F9-240E077D625B
...

View File

@ -0,0 +1,2 @@
MODULE mac x86_64 601705B3B1227B7D39F9240E077D625B0 mac.out
PUBLIC ff0 0 _start

View File

@ -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

View File

@ -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();
}