forked from OSchip/llvm-project
Retrieve the deployment target when retrieving an object file's triple.
Getting the deployment target can be significant information when rebuilding clang modules since availability information could depend on it. rdar://problem/40039633 Differential Revision: https://reviews.llvm.org/D46669 llvm-svn: 332067
This commit is contained in:
parent
f9fc9513bf
commit
9702c963ab
|
@ -0,0 +1,205 @@
|
|||
# RUN: yaml2obj %s > %t.out
|
||||
# RUN: lldb-test symbols %t.out | FileCheck %s
|
||||
# REQUIRES: darwin
|
||||
# Test that the deployment target is parsed from the load commands.
|
||||
# CHECK: x86_64-apple-macosx10.9.0
|
||||
--- !mach-o
|
||||
FileHeader:
|
||||
magic: 0xFEEDFACF
|
||||
cputype: 0x01000007
|
||||
cpusubtype: 0x80000003
|
||||
filetype: 0x00000002
|
||||
ncmds: 14
|
||||
sizeofcmds: 728
|
||||
flags: 0x00200085
|
||||
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: 232
|
||||
segname: __TEXT
|
||||
vmaddr: 4294967296
|
||||
vmsize: 4096
|
||||
fileoff: 0
|
||||
filesize: 4096
|
||||
maxprot: 7
|
||||
initprot: 5
|
||||
nsects: 2
|
||||
flags: 0
|
||||
Sections:
|
||||
- sectname: __text
|
||||
segname: __TEXT
|
||||
addr: 0x0000000100000FB0
|
||||
size: 8
|
||||
offset: 0x00000FB0
|
||||
align: 0
|
||||
reloff: 0x00000000
|
||||
nreloc: 0
|
||||
flags: 0x80000400
|
||||
reserved1: 0x00000000
|
||||
reserved2: 0x00000000
|
||||
reserved3: 0x00000000
|
||||
- sectname: __unwind_info
|
||||
segname: __TEXT
|
||||
addr: 0x0000000100000FB8
|
||||
size: 72
|
||||
offset: 0x00000FB8
|
||||
align: 2
|
||||
reloff: 0x00000000
|
||||
nreloc: 0
|
||||
flags: 0x00000000
|
||||
reserved1: 0x00000000
|
||||
reserved2: 0x00000000
|
||||
reserved3: 0x00000000
|
||||
- cmd: LC_SEGMENT_64
|
||||
cmdsize: 72
|
||||
segname: __LINKEDIT
|
||||
vmaddr: 4294971392
|
||||
vmsize: 4096
|
||||
fileoff: 4096
|
||||
filesize: 152
|
||||
maxprot: 7
|
||||
initprot: 1
|
||||
nsects: 0
|
||||
flags: 0
|
||||
- cmd: LC_DYLD_INFO_ONLY
|
||||
cmdsize: 48
|
||||
rebase_off: 0
|
||||
rebase_size: 0
|
||||
bind_off: 0
|
||||
bind_size: 0
|
||||
weak_bind_off: 0
|
||||
weak_bind_size: 0
|
||||
lazy_bind_off: 0
|
||||
lazy_bind_size: 0
|
||||
export_off: 4096
|
||||
export_size: 48
|
||||
- cmd: LC_SYMTAB
|
||||
cmdsize: 24
|
||||
symoff: 4152
|
||||
nsyms: 3
|
||||
stroff: 4200
|
||||
strsize: 48
|
||||
- cmd: LC_DYSYMTAB
|
||||
cmdsize: 80
|
||||
ilocalsym: 0
|
||||
nlocalsym: 0
|
||||
iextdefsym: 0
|
||||
nextdefsym: 2
|
||||
iundefsym: 2
|
||||
nundefsym: 1
|
||||
tocoff: 0
|
||||
ntoc: 0
|
||||
modtaboff: 0
|
||||
nmodtab: 0
|
||||
extrefsymoff: 0
|
||||
nextrefsyms: 0
|
||||
indirectsymoff: 0
|
||||
nindirectsyms: 0
|
||||
extreloff: 0
|
||||
nextrel: 0
|
||||
locreloff: 0
|
||||
nlocrel: 0
|
||||
- cmd: LC_LOAD_DYLINKER
|
||||
cmdsize: 32
|
||||
name: 12
|
||||
PayloadString: /usr/lib/dyld
|
||||
ZeroPadBytes: 7
|
||||
- cmd: LC_UUID
|
||||
cmdsize: 24
|
||||
uuid: E75E737C-4FB3-312D-9B17-10987F48F957
|
||||
- cmd: LC_VERSION_MIN_MACOSX
|
||||
cmdsize: 16
|
||||
version: 657664
|
||||
sdk: 658944
|
||||
- cmd: LC_SOURCE_VERSION
|
||||
cmdsize: 16
|
||||
version: 0
|
||||
- cmd: LC_MAIN
|
||||
cmdsize: 24
|
||||
entryoff: 4016
|
||||
stacksize: 0
|
||||
- cmd: LC_LOAD_DYLIB
|
||||
cmdsize: 56
|
||||
dylib:
|
||||
name: 24
|
||||
timestamp: 2
|
||||
current_version: 82102276
|
||||
compatibility_version: 65536
|
||||
PayloadString: /usr/lib/libSystem.B.dylib
|
||||
ZeroPadBytes: 6
|
||||
- cmd: LC_FUNCTION_STARTS
|
||||
cmdsize: 16
|
||||
dataoff: 4144
|
||||
datasize: 8
|
||||
- cmd: LC_DATA_IN_CODE
|
||||
cmdsize: 16
|
||||
dataoff: 4152
|
||||
datasize: 0
|
||||
LinkEditData:
|
||||
ExportTrie:
|
||||
TerminalSize: 0
|
||||
NodeOffset: 0
|
||||
Name: ''
|
||||
Flags: 0x0000000000000000
|
||||
Address: 0x0000000000000000
|
||||
Other: 0x0000000000000000
|
||||
ImportName: ''
|
||||
Children:
|
||||
- TerminalSize: 0
|
||||
NodeOffset: 5
|
||||
Name: _
|
||||
Flags: 0x0000000000000000
|
||||
Address: 0x0000000000000000
|
||||
Other: 0x0000000000000000
|
||||
ImportName: ''
|
||||
Children:
|
||||
- TerminalSize: 2
|
||||
NodeOffset: 33
|
||||
Name: _mh_execute_header
|
||||
Flags: 0x0000000000000000
|
||||
Address: 0x0000000000000000
|
||||
Other: 0x0000000000000000
|
||||
ImportName: ''
|
||||
- TerminalSize: 3
|
||||
NodeOffset: 37
|
||||
Name: main
|
||||
Flags: 0x0000000000000000
|
||||
Address: 0x0000000000000FB0
|
||||
Other: 0x0000000000000000
|
||||
ImportName: ''
|
||||
NameList:
|
||||
- n_strx: 2
|
||||
n_type: 0x0F
|
||||
n_sect: 1
|
||||
n_desc: 16
|
||||
n_value: 4294967296
|
||||
- n_strx: 22
|
||||
n_type: 0x0F
|
||||
n_sect: 1
|
||||
n_desc: 0
|
||||
n_value: 4294971312
|
||||
- n_strx: 28
|
||||
n_type: 0x01
|
||||
n_sect: 0
|
||||
n_desc: 256
|
||||
n_value: 0
|
||||
StringTable:
|
||||
- ' '
|
||||
- __mh_execute_header
|
||||
- _main
|
||||
- dyld_stub_binder
|
||||
- ''
|
||||
- ''
|
||||
- ''
|
||||
...
|
|
@ -4819,7 +4819,7 @@ void ObjectFileMachO::Dump(Stream *s) {
|
|||
GetArchitecture(header_arch);
|
||||
|
||||
*s << ", file = '" << m_file
|
||||
<< "', arch = " << header_arch.GetArchitectureName() << "\n";
|
||||
<< "', triple = " << header_arch.GetTriple().getTriple() << "\n";
|
||||
|
||||
SectionList *sections = GetSectionList();
|
||||
if (sections)
|
||||
|
@ -4867,6 +4867,21 @@ bool ObjectFileMachO::GetUUID(const llvm::MachO::mach_header &header,
|
|||
return false;
|
||||
}
|
||||
|
||||
static const char *GetOSName(uint32_t cmd) {
|
||||
switch (cmd) {
|
||||
case llvm::MachO::LC_VERSION_MIN_IPHONEOS:
|
||||
return "ios";
|
||||
case llvm::MachO::LC_VERSION_MIN_MACOSX:
|
||||
return "macosx";
|
||||
case llvm::MachO::LC_VERSION_MIN_TVOS:
|
||||
return "tvos";
|
||||
case llvm::MachO::LC_VERSION_MIN_WATCHOS:
|
||||
return "watchos";
|
||||
default:
|
||||
llvm_unreachable("unexpected LC_VERSION load command");
|
||||
}
|
||||
}
|
||||
|
||||
bool ObjectFileMachO::GetArchitecture(const llvm::MachO::mach_header &header,
|
||||
const lldb_private::DataExtractor &data,
|
||||
lldb::offset_t lc_offset,
|
||||
|
@ -4905,23 +4920,29 @@ bool ObjectFileMachO::GetArchitecture(const llvm::MachO::mach_header &header,
|
|||
if (data.GetU32(&offset, &load_cmd, 2) == NULL)
|
||||
break;
|
||||
|
||||
uint32_t major, minor, patch;
|
||||
struct version_min_command version_min;
|
||||
|
||||
llvm::SmallString<16> os_name;
|
||||
llvm::raw_svector_ostream os(os_name);
|
||||
|
||||
switch (load_cmd.cmd) {
|
||||
case llvm::MachO::LC_VERSION_MIN_IPHONEOS:
|
||||
triple.setOS(llvm::Triple::IOS);
|
||||
return true;
|
||||
|
||||
case llvm::MachO::LC_VERSION_MIN_MACOSX:
|
||||
triple.setOS(llvm::Triple::MacOSX);
|
||||
return true;
|
||||
|
||||
case llvm::MachO::LC_VERSION_MIN_TVOS:
|
||||
triple.setOS(llvm::Triple::TvOS);
|
||||
return true;
|
||||
|
||||
case llvm::MachO::LC_VERSION_MIN_WATCHOS:
|
||||
triple.setOS(llvm::Triple::WatchOS);
|
||||
if (load_cmd.cmdsize != sizeof(version_min))
|
||||
break;
|
||||
data.ExtractBytes(cmd_offset,
|
||||
sizeof(version_min), data.GetByteOrder(),
|
||||
&version_min);
|
||||
major = version_min.version >> 16;
|
||||
minor = (version_min.version >> 8) & 0xffu;
|
||||
patch = version_min.version & 0xffu;
|
||||
os << GetOSName(load_cmd.cmd) << major << '.' << minor << '.'
|
||||
<< patch;
|
||||
triple.setOSName(os.str());
|
||||
return true;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue