summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorChris Bieneman <beanz@apple.com>2016-06-02 23:58:13 +0000
committerChris Bieneman <beanz@apple.com>2016-06-02 23:58:13 +0000
commit24df841234d1bf34c39eb312e4ce6668bf97bf9a (patch)
tree607407545a1dfe297e7377fb51fcad38a3a255ad /llvm/tools
parent03412067e79830a980764014b14f81be7c1ca880 (diff)
downloadbcm5719-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.cpp92
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();
}
OpenPOWER on IntegriCloud