[Lldb-commits] [PATCH] D46669: Retrieve the deployment target when retrieving an object file's triple
This revision was automatically updated to reflect the committed changes. Closed by commit rL332067: Retrieve the deployment target when retrieving an object files triple. (authored by adrian, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D46669?vs=146235=146264#toc Repository: rL LLVM https://reviews.llvm.org/D46669 Files: lldb/trunk/lit/Modules/lc_version_min.yaml lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Index: lldb/trunk/lit/Modules/lc_version_min.yaml === --- lldb/trunk/lit/Modules/lc_version_min.yaml +++ lldb/trunk/lit/Modules/lc_version_min.yaml @@ -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: 0x0107 + cpusubtype: 0x8003 + filetype:0x0002 + ncmds: 14 + sizeofcmds: 728 + flags: 0x00200085 + reserved:0x +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:0x00010FB0 +size:8 +offset: 0x0FB0 +align: 0 +reloff: 0x +nreloc: 0 +flags: 0x8400 +reserved1: 0x +reserved2: 0x +reserved3: 0x + - sectname:__unwind_info +segname: __TEXT +addr:0x00010FB8 +size:72 +offset: 0x0FB8 +align: 2 +reloff: 0x +nreloc: 0 +flags: 0x +reserved1: 0x +reserved2: 0x +reserved3: 0x + - 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 +
[Lldb-commits] [PATCH] D46669: Retrieve the deployment target when retrieving an object file's triple
jasonmolenda accepted this revision. jasonmolenda added a comment. This revision is now accepted and ready to land. Looks good. https://reviews.llvm.org/D46669 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D46669: Retrieve the deployment target when retrieving an object file's triple
aprantl updated this revision to Diff 146235. aprantl added a comment. Added a REQUIRES: darwin https://reviews.llvm.org/D46669 Files: lit/Modules/lc_version_min.yaml source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp === --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -4814,7 +4814,7 @@ GetArchitecture(header_arch); *s << ", file = '" << m_file - << "', arch = " << header_arch.GetArchitectureName() << "\n"; + << "', triple = " << header_arch.GetTriple().getTriple() << "\n"; SectionList *sections = GetSectionList(); if (sections) @@ -4862,6 +4862,21 @@ 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 , const lldb_private::DataExtractor , lldb::offset_t lc_offset, @@ -4900,23 +4915,29 @@ if (data.GetU32(, _cmd, 2) == NULL) break; +uint32_t major, minor, patch; +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(), +_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; } Index: lit/Modules/lc_version_min.yaml === --- /dev/null +++ lit/Modules/lc_version_min.yaml @@ -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: 0x0107 + cpusubtype: 0x8003 + filetype:0x0002 + ncmds: 14 + sizeofcmds: 728 + flags: 0x00200085 + reserved:0x +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:0x00010FB0 +size:8 +offset: 0x0FB0 +align: 0 +reloff: 0x +nreloc: 0 +flags: 0x8400 +reserved1: 0x +reserved2: 0x +reserved3: 0x + - sectname:__unwind_info +segname: __TEXT +addr:0x00010FB8 +size:72 +offset: 0x0FB8 +align: 2 +reloff: 0x +nreloc: 0 +flags: 0x +reserved1: 0x +reserved2: 0x +reserved3: 0x + - cmd: LC_SEGMENT_64 +cmdsize: 72 +segname: __LINKEDIT +
[Lldb-commits] [PATCH] D46669: Retrieve the deployment target when retrieving an object file's triple
aprantl updated this revision to Diff 146234. aprantl added a comment. Much smaller test thanks to Pavel's suggestion! https://reviews.llvm.org/D46669 Files: lit/Modules/lc_version_min.yaml source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp === --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -4814,7 +4814,7 @@ GetArchitecture(header_arch); *s << ", file = '" << m_file - << "', arch = " << header_arch.GetArchitectureName() << "\n"; + << "', triple = " << header_arch.GetTriple().getTriple() << "\n"; SectionList *sections = GetSectionList(); if (sections) @@ -4862,6 +4862,21 @@ 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 , const lldb_private::DataExtractor , lldb::offset_t lc_offset, @@ -4900,23 +4915,29 @@ if (data.GetU32(, _cmd, 2) == NULL) break; +uint32_t major, minor, patch; +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(), +_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; } Index: lit/Modules/lc_version_min.yaml === --- /dev/null +++ lit/Modules/lc_version_min.yaml @@ -0,0 +1,204 @@ +# RUN: yaml2obj %s > %t.out +# RUN: lldb-test symbols %t.out | FileCheck %s +# Test that the deployment target is parsed from the load commands. +# CHECK: x86_64-apple-macosx10.9.0 +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x0107 + cpusubtype: 0x8003 + filetype:0x0002 + ncmds: 14 + sizeofcmds: 728 + flags: 0x00200085 + reserved:0x +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:0x00010FB0 +size:8 +offset: 0x0FB0 +align: 0 +reloff: 0x +nreloc: 0 +flags: 0x8400 +reserved1: 0x +reserved2: 0x +reserved3: 0x + - sectname:__unwind_info +segname: __TEXT +addr:0x00010FB8 +size:72 +offset: 0x0FB8 +align: 2 +reloff: 0x +nreloc: 0 +flags: 0x +reserved1: 0x +reserved2: 0x +reserved3: 0x + - cmd: LC_SEGMENT_64 +cmdsize: 72 +segname: __LINKEDIT +
[Lldb-commits] [PATCH] D46669: Retrieve the deployment target when retrieving an object file's triple
labath added a comment. The test you copied this from predates `lldb-test` (and it tests some behavior quirks which are not nicely expressible in text output). We should have nicer ways of testing things like this now. It should be sufficient to add a print line which displays the triple in the `dumpModules` function in `lldb-test.cpp`. Then you can just run `lldb-test module-sections your-file` and FileCheck that. The other thing you will need to do is make this test darwin-only as right now our MachO parsing code does not work on non-apple platforms. The reason for that is very silly - ObjectFileMachO depends on RegisterContextDarwin_XXX (presumably to read register information from core files), which use constants like `KERN_SUCCESS` from system headers. (I've looked at this recently because I wanted to make some cross-platform tests for apple debug info and got stuck here.) https://reviews.llvm.org/D46669 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D46669: Retrieve the deployment target when retrieving an object file's triple
aprantl created this revision. aprantl added a reviewer: jasonmolenda. Herald added a subscriber: mgorny. Getting the deployment target can be significant information when rebuilding clang modules since availability information could depend on it. The unittest is cargo-culted from the ELF unit tests. rdar://problem/40039633 https://reviews.llvm.org/D46669 Files: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp unittests/ObjectFile/CMakeLists.txt unittests/ObjectFile/MachO/CMakeLists.txt unittests/ObjectFile/MachO/Inputs/lc_version_min.yaml unittests/ObjectFile/MachO/TestObjectFileMachO.cpp Index: unittests/ObjectFile/MachO/TestObjectFileMachO.cpp === --- /dev/null +++ unittests/ObjectFile/MachO/TestObjectFileMachO.cpp @@ -0,0 +1,79 @@ +//===-- TestObjectFileMachO.cpp ---*- C++ -*-===// +// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h" +#include "TestingSupport/TestUtilities.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" +#include "lldb/Core/Section.h" +#include "lldb/Host/HostInfo.h" +#include "llvm/ADT/Optional.h" +#include "llvm/Support/Compression.h" +#include "llvm/Support/FileUtilities.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/raw_ostream.h" +#include "gtest/gtest.h" + +using namespace lldb_private; +using namespace lldb; + +class ObjectFileMachOTest : public testing::Test { +public: + void SetUp() override { +HostInfo::Initialize(); +ObjectFileMachO::Initialize(); + } + + void TearDown() override { +ObjectFileMachO::Terminate(); +HostInfo::Terminate(); + } + +protected: +}; + +#define ASSERT_NO_ERROR(x) \ + if (std::error_code ASSERT_NO_ERROR_ec = x) {\ +llvm::SmallString<128> MessageStorage; \ +llvm::raw_svector_ostream Message(MessageStorage); \ +Message << #x ": did not return errc::success.\n" \ +<< "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ +<< "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ +GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ + } else { \ + } + +TEST_F(ObjectFileMachOTest, LCVersionMin) { + std::string yaml = GetInputFilePath("lc_version_min.yaml"); + llvm::SmallString<128> obj; + ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( + "lc_version_min-%%", "obj", obj)); + + llvm::FileRemover remover(obj); + const char *args[] = {YAML2OBJ, yaml.c_str(), nullptr}; + llvm::StringRef obj_ref = obj; + const llvm::Optional redirects[] = {llvm::None, obj_ref, + llvm::None}; + ASSERT_EQ(0, llvm::sys::ExecuteAndWait(YAML2OBJ, args, nullptr, redirects)); + uint64_t size; + ASSERT_NO_ERROR(llvm::sys::fs::file_size(obj, size)); + ASSERT_GT(size, 0u); + + ModuleSpec spec{FileSpec(obj, false)}; + spec.GetSymbolFileSpec().SetFile(obj, false); + auto module_sp = std::make_shared(spec); + SectionList *list = module_sp->GetSectionList(); + ASSERT_NE(nullptr, list); + + + ArchSpec arch = module_sp->GetArchitecture(); + ASSERT_EQ(arch.GetTriple().getOSName(), "macosx10.9.0"); +} Index: unittests/ObjectFile/MachO/Inputs/lc_version_min.yaml === --- /dev/null +++ unittests/ObjectFile/MachO/Inputs/lc_version_min.yaml @@ -0,0 +1,200 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x0107 + cpusubtype: 0x8003 + filetype:0x0002 + ncmds: 14 + sizeofcmds: 728 + flags: 0x00200085 + reserved:0x +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:0x00010FB0 +