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:
parent
35ab86df62
commit
7630e0bcbe
|
@ -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
|
||||
...
|
|
@ -0,0 +1,2 @@
|
|||
MODULE mac x86_64 601705B3B1227B7D39F9240E077D625B0 mac.out
|
||||
PUBLIC ff0 0 _start
|
|
@ -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
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue