[llvm] r271613 - Revert "[yaml2obj] Sort MachO LinkEdit write operations based on offset"
Chris Bieneman via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 2 16:58:14 PDT 2016
Author: cbieneman
Date: Thu Jun 2 18:58:13 2016
New Revision: 271613
URL: http://llvm.org/viewvc/llvm-project?rev=271613&view=rev
Log:
Revert "[yaml2obj] Sort MachO LinkEdit write operations based on offset"
This reverts commit r271611 because it broke a bot:
http://bb.pgr.jp/builders/cmake-llvm-x86_64-linux/builds/38184
I don't currently have a handle on what went wrong, so I'll revert while I investigate.
Removed:
llvm/trunk/test/ObjectYAML/MachO/out_of_order_linkedit.yaml
Modified:
llvm/trunk/tools/yaml2obj/yaml2macho.cpp
Removed: llvm/trunk/test/ObjectYAML/MachO/out_of_order_linkedit.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/out_of_order_linkedit.yaml?rev=271612&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/out_of_order_linkedit.yaml (original)
+++ llvm/trunk/test/ObjectYAML/MachO/out_of_order_linkedit.yaml (removed)
@@ -1,266 +0,0 @@
-# RUN: yaml2obj -format=macho %s | obj2yaml | FileCheck %s
-
---- !mach-o
-FileHeader:
- magic: 0xFEEDFACF
- cputype: 0x01000007
- cpusubtype: 0x80000003
- filetype: 0x00000002
- ncmds: 16
- sizeofcmds: 1408
- flags: 0x00218085
- 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: 552
- segname: __TEXT
- vmaddr: 4294967296
- vmsize: 8192
- fileoff: 0
- filesize: 8192
- maxprot: 7
- initprot: 5
- nsects: 6
- flags: 0
- - cmd: LC_SEGMENT_64
- cmdsize: 312
- segname: __DATA
- vmaddr: 4294975488
- vmsize: 4096
- fileoff: 8192
- filesize: 4096
- maxprot: 7
- initprot: 3
- nsects: 3
- flags: 0
- - cmd: LC_SEGMENT_64
- cmdsize: 72
- segname: __LINKEDIT
- vmaddr: 4294979584
- vmsize: 4096
- fileoff: 12288
- filesize: 2508
- maxprot: 7
- initprot: 1
- nsects: 0
- flags: 0
- - cmd: LC_DYLD_INFO_ONLY
- cmdsize: 48
- rebase_off: 12384
- rebase_size: 8
- bind_off: 12288
- bind_size: 96
- weak_bind_off: 0
- weak_bind_size: 0
- lazy_bind_off: 12392
- lazy_bind_size: 624
- export_off: 13016
- export_size: 48
- - cmd: LC_SYMTAB
- cmdsize: 24
- symoff: 13080
- nsyms: 30
- stroff: 13700
- strsize: 1096
- - cmd: LC_DYSYMTAB
- cmdsize: 80
- ilocalsym: 0
- nlocalsym: 9
- iextdefsym: 9
- nextdefsym: 2
- iundefsym: 11
- nundefsym: 19
- tocoff: 0
- ntoc: 0
- modtaboff: 0
- nmodtab: 0
- extrefsymoff: 0
- nextrefsyms: 0
- indirectsymoff: 13560
- nindirectsyms: 35
- 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: 461A1B28-822F-3F38-B670-645419E636F5
- - cmd: LC_VERSION_MIN_MACOSX
- cmdsize: 16
- version: 658176
- sdk: 658176
- - cmd: LC_SOURCE_VERSION
- cmdsize: 16
- version: 0
- - cmd: LC_MAIN
- cmdsize: 24
- entryoff: 4448
- stacksize: 0
- - cmd: LC_LOAD_DYLIB
- cmdsize: 48
- dylib:
- name: 24
- timestamp: 2
- current_version: 7864576
- compatibility_version: 65536
- PayloadString: '/usr/lib/libc++.1.dylib'
- ZeroPadBytes: 1
- - cmd: LC_LOAD_DYLIB
- cmdsize: 56
- dylib:
- name: 24
- timestamp: 2
- current_version: 80349697
- compatibility_version: 65536
- PayloadString: /usr/lib/libSystem.B.dylib
- ZeroPadBytes: 6
- - cmd: LC_FUNCTION_STARTS
- cmdsize: 16
- dataoff: 13064
- datasize: 16
- - cmd: LC_DATA_IN_CODE
- cmdsize: 16
- dataoff: 13080
- datasize: 0
-LinkEditData:
- RebaseOpcodes:
- - Opcode: REBASE_OPCODE_SET_TYPE_IMM
- Imm: 1
- - Opcode: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
- Imm: 2
- ExtraData:
- - 0x0000000000000028
- - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES
- Imm: 0
- ExtraData:
- - 0x000000000000000F
- - Opcode: REBASE_OPCODE_DONE
- Imm: 0
- BindOpcodes:
- - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
- Imm: 1
- Symbol: ''
- - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
- Imm: 0
- Symbol: __ZNSt3__14coutE
- - Opcode: BIND_OPCODE_SET_TYPE_IMM
- Imm: 1
- Symbol: ''
- - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
- Imm: 2
- ULEBExtraData:
- - 0x0000000000000000
- Symbol: ''
- - Opcode: BIND_OPCODE_DO_BIND
- Imm: 0
- Symbol: ''
- - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
- Imm: 0
- Symbol: __ZNSt3__15ctypeIcE2idE
- - Opcode: BIND_OPCODE_DO_BIND
- Imm: 0
- Symbol: ''
- - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
- Imm: 0
- Symbol: ___gxx_personality_v0
- - Opcode: BIND_OPCODE_DO_BIND
- Imm: 0
- Symbol: ''
- - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
- Imm: 2
- Symbol: ''
- - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
- Imm: 0
- Symbol: dyld_stub_binder
- - Opcode: BIND_OPCODE_DO_BIND
- Imm: 0
- Symbol: ''
- - Opcode: BIND_OPCODE_DONE
- Imm: 0
- Symbol: ''
-...
-
-#CHECK: - cmd: LC_DYLD_INFO_ONLY
-#CHECK: cmdsize: 48
-#CHECK: rebase_off: 12384
-#CHECK: rebase_size: 8
-#CHECK: bind_off: 12288
-#CHECK: bind_size: 96
-#CHECK: weak_bind_off: 0
-#CHECK: weak_bind_size: 0
-#CHECK: lazy_bind_off: 12392
-#CHECK: lazy_bind_size: 624
-#CHECK: export_off: 13016
-#CHECK: export_size: 48
-#CHECK: LinkEditData:
-#CHECK: RebaseOpcodes:
-#CHECK: - Opcode: REBASE_OPCODE_SET_TYPE_IMM
-#CHECK: Imm: 1
-#CHECK: - Opcode: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
-#CHECK: Imm: 2
-#CHECK: ExtraData:
-#CHECK: - 0x0000000000000028
-#CHECK: - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES
-#CHECK: Imm: 0
-#CHECK: ExtraData:
-#CHECK: - 0x000000000000000F
-#CHECK: - Opcode: REBASE_OPCODE_DONE
-#CHECK: Imm: 0
-#CHECK: BindOpcodes:
-#CHECK: - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
-#CHECK: Imm: 1
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
-#CHECK: Imm: 0
-#CHECK: Symbol: __ZNSt3__14coutE
-#CHECK: - Opcode: BIND_OPCODE_SET_TYPE_IMM
-#CHECK: Imm: 1
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
-#CHECK: Imm: 2
-#CHECK: ULEBExtraData:
-#CHECK: - 0x0000000000000000
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_DO_BIND
-#CHECK: Imm: 0
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
-#CHECK: Imm: 0
-#CHECK: Symbol: __ZNSt3__15ctypeIcE2idE
-#CHECK: - Opcode: BIND_OPCODE_DO_BIND
-#CHECK: Imm: 0
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
-#CHECK: Imm: 0
-#CHECK: Symbol: ___gxx_personality_v0
-#CHECK: - Opcode: BIND_OPCODE_DO_BIND
-#CHECK: Imm: 0
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
-#CHECK: Imm: 2
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
-#CHECK: Imm: 0
-#CHECK: Symbol: dyld_stub_binder
-#CHECK: - Opcode: BIND_OPCODE_DO_BIND
-#CHECK: Imm: 0
-#CHECK: Symbol: ''
-#CHECK: - Opcode: BIND_OPCODE_DONE
-#CHECK: Imm: 0
-#CHECK: Symbol: ''
Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=271613&r1=271612&r2=271613&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Thu Jun 2 18:58:13 2016
@@ -46,15 +46,8 @@ private:
Error writeLoadCommands(raw_ostream &OS);
Error writeSectionData(raw_ostream &OS);
Error writeLinkEditData(raw_ostream &OS);
- void writeBindOpcodes(raw_ostream &OS,
+ void writeBindOpcodes(raw_ostream &OS, uint64_t offset,
std::vector<MachOYAML::BindOpcode> &BindOpcodes);
- // LinkEdit writers
- Error writeRebaseOpcodes(raw_ostream &OS);
- Error writeBasicBindOpcodes(raw_ostream &OS);
- Error writeWeakBindOpcodes(raw_ostream &OS);
- Error writeLazyBindOpcodes(raw_ostream &OS);
- Error writeNameList(raw_ostream &OS);
- Error writeStringTable(raw_ostream &OS);
Error writeExportTrie(raw_ostream &OS);
void dumpExportEntry(raw_ostream &OS, MachOYAML::ExportEntry &Entry);
@@ -282,7 +275,9 @@ Error MachOWriter::writeSectionData(raw_
}
void MachOWriter::writeBindOpcodes(
- raw_ostream &OS, std::vector<MachOYAML::BindOpcode> &BindOpcodes) {
+ raw_ostream &OS, uint64_t offset,
+ std::vector<MachOYAML::BindOpcode> &BindOpcodes) {
+ ZeroToOffset(OS, offset);
for (auto Opcode : BindOpcodes) {
uint8_t OpByte = Opcode.Opcode | Opcode.Imm;
@@ -342,55 +337,21 @@ void writeNListEntry(MachOYAML::NListEnt
}
Error MachOWriter::writeLinkEditData(raw_ostream &OS) {
- typedef Error (MachOWriter::*writeHandler)(raw_ostream &);
- typedef std::pair<uint64_t, writeHandler> writeOperation;
- std::vector<writeOperation> WriteQueue;
-
+ MachOYAML::LinkEditData &LinkEdit = Obj.LinkEdit;
MachO::dyld_info_command *DyldInfoOnlyCmd = 0;
MachO::symtab_command *SymtabCmd = 0;
for (auto &LC : Obj.LoadCommands) {
switch (LC.Data.load_command_data.cmd) {
case MachO::LC_SYMTAB:
SymtabCmd = &LC.Data.symtab_command_data;
- WriteQueue.push_back(
- std::make_pair(SymtabCmd->symoff, &MachOWriter::writeNameList));
- WriteQueue.push_back(
- std::make_pair(SymtabCmd->stroff, &MachOWriter::writeStringTable));
break;
case MachO::LC_DYLD_INFO_ONLY:
DyldInfoOnlyCmd = &LC.Data.dyld_info_command_data;
- WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->rebase_off,
- &MachOWriter::writeRebaseOpcodes));
- WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->bind_off,
- &MachOWriter::writeBasicBindOpcodes));
- WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->weak_bind_off,
- &MachOWriter::writeWeakBindOpcodes));
- WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->lazy_bind_off,
- &MachOWriter::writeLazyBindOpcodes));
- WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->export_off,
- &MachOWriter::writeExportTrie));
break;
}
}
- std::sort(
- WriteQueue.begin(), WriteQueue.end(),
- [](writeOperation &a, writeOperation &b) { return a.first < b.first; });
-
- for (auto writeOp : WriteQueue) {
- ZeroToOffset(OS, writeOp.first);
- if (auto Err = (this->*writeOp.second)(OS))
- return Err;
- }
-
- // Fill to the end of the string table
- ZeroToOffset(OS, SymtabCmd->stroff + SymtabCmd->strsize);
-
- return Error::success();
-}
-
-Error MachOWriter::writeRebaseOpcodes(raw_ostream &OS) {
- MachOYAML::LinkEditData &LinkEdit = Obj.LinkEdit;
+ ZeroToOffset(OS, DyldInfoOnlyCmd->rebase_off);
for (auto Opcode : LinkEdit.RebaseOpcodes) {
uint8_t OpByte = Opcode.Opcode | Opcode.Imm;
@@ -399,39 +360,38 @@ Error MachOWriter::writeRebaseOpcodes(ra
encodeULEB128(Data, OS);
}
}
- return Error::success();
-}
-Error MachOWriter::writeBasicBindOpcodes(raw_ostream &OS) {
- writeBindOpcodes(OS, Obj.LinkEdit.BindOpcodes);
- return Error::success();
-}
+ writeBindOpcodes(OS, DyldInfoOnlyCmd->bind_off, LinkEdit.BindOpcodes);
+ writeBindOpcodes(OS, DyldInfoOnlyCmd->weak_bind_off,
+ LinkEdit.WeakBindOpcodes);
+ writeBindOpcodes(OS, DyldInfoOnlyCmd->lazy_bind_off,
+ LinkEdit.LazyBindOpcodes);
-Error MachOWriter::writeWeakBindOpcodes(raw_ostream &OS) {
- writeBindOpcodes(OS, Obj.LinkEdit.WeakBindOpcodes);
- return Error::success();
-}
-
-Error MachOWriter::writeLazyBindOpcodes(raw_ostream &OS) {
- writeBindOpcodes(OS, Obj.LinkEdit.LazyBindOpcodes);
- return Error::success();
-}
+ ZeroToOffset(OS, DyldInfoOnlyCmd->export_off);
+ if (auto Err = writeExportTrie(OS))
+ return Err;
-Error MachOWriter::writeNameList(raw_ostream &OS) {
- for (auto NLE : Obj.LinkEdit.NameList) {
+ ZeroToOffset(OS, SymtabCmd->symoff);
+
+ for (auto NLE : LinkEdit.NameList) {
if (is64Bit)
writeNListEntry<MachO::nlist_64>(NLE, OS);
else
writeNListEntry<MachO::nlist>(NLE, OS);
}
- return Error::success();
-}
-Error MachOWriter::writeStringTable(raw_ostream &OS) {
- for (auto Str : Obj.LinkEdit.StringTable) {
+ auto currOffset = OS.tell() - fileStart;
+ if (currOffset < SymtabCmd->stroff)
+ Fill(OS, SymtabCmd->stroff - currOffset, 0xDEADBEEFu);
+
+ for (auto Str : LinkEdit.StringTable) {
OS.write(Str.data(), Str.size());
OS.write('\0');
}
+
+ // Fill to the end of the string table
+ ZeroToOffset(OS, SymtabCmd->stroff + SymtabCmd->strsize);
+
return Error::success();
}
More information about the llvm-commits
mailing list