diff options
| author | Chris Bieneman <beanz@apple.com> | 2016-06-02 23:58:13 +0000 |
|---|---|---|
| committer | Chris Bieneman <beanz@apple.com> | 2016-06-02 23:58:13 +0000 |
| commit | 24df841234d1bf34c39eb312e4ce6668bf97bf9a (patch) | |
| tree | 607407545a1dfe297e7377fb51fcad38a3a255ad /llvm/tools | |
| parent | 03412067e79830a980764014b14f81be7c1ca880 (diff) | |
| download | bcm5719-llvm-24df841234d1bf34c39eb312e4ce6668bf97bf9a.tar.gz bcm5719-llvm-24df841234d1bf34c39eb312e4ce6668bf97bf9a.zip | |
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.
llvm-svn: 271613
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/yaml2obj/yaml2macho.cpp | 92 |
1 files changed, 26 insertions, 66 deletions
diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp index 533811507df..d65aabc5c86 100644 --- a/llvm/tools/yaml2obj/yaml2macho.cpp +++ b/llvm/tools/yaml2obj/yaml2macho.cpp @@ -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_ostream &OS) { } 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::NListEntry &NLE, raw_ostream &OS) { } 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(raw_ostream &OS) { encodeULEB128(Data, OS); } } - return Error::success(); -} - -Error MachOWriter::writeBasicBindOpcodes(raw_ostream &OS) { - writeBindOpcodes(OS, Obj.LinkEdit.BindOpcodes); - return Error::success(); -} -Error MachOWriter::writeWeakBindOpcodes(raw_ostream &OS) { - writeBindOpcodes(OS, Obj.LinkEdit.WeakBindOpcodes); - 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::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(); } |

