summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/obj2yaml/macho2yaml.cpp25
-rw-r--r--llvm/tools/yaml2obj/yaml2macho.cpp36
2 files changed, 46 insertions, 15 deletions
diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp
index ad6969cdd4a..eb875ffa1cf 100644
--- a/llvm/tools/obj2yaml/macho2yaml.cpp
+++ b/llvm/tools/obj2yaml/macho2yaml.cpp
@@ -9,9 +9,9 @@
#include "Error.h"
#include "obj2yaml.h"
-#include "llvm/Support/ErrorHandling.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/ObjectYAML/MachOYAML.h"
+#include "llvm/Support/ErrorHandling.h"
using namespace llvm;
@@ -24,6 +24,14 @@ public:
Expected<std::unique_ptr<MachOYAML::Object>> dump();
};
+#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
+ case MachO::LCName: \
+ memcpy((void *) & (LC.load_command_data.LCStruct), LoadCmd.Ptr, \
+ sizeof(MachO::LCStruct)); \
+ if (Obj.isLittleEndian() != sys::IsLittleEndianHost) \
+ MachO::swapStruct(LC.load_command_data.LCStruct); \
+ break;
+
Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
auto Y = make_unique<MachOYAML::Object>();
Y->Header.magic = Obj.getHeader().magic;
@@ -35,10 +43,17 @@ Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
Y->Header.flags = Obj.getHeader().flags;
Y->Header.reserved = 0;
- for (auto load_command : Obj.load_commands()) {
- auto LC = make_unique<MachOYAML::LoadCommand>();
- LC->cmd = static_cast<MachO::LoadCommandType>(load_command.C.cmd);
- LC->cmdsize = load_command.C.cmdsize;
+ for (auto LoadCmd : Obj.load_commands()) {
+ MachOYAML::LoadCommand LC;
+ switch (LoadCmd.C.cmd) {
+ default:
+ memcpy((void *)&(LC.load_command_data.load_command), LoadCmd.Ptr,
+ sizeof(MachO::load_command));
+ if (Obj.isLittleEndian() != sys::IsLittleEndianHost)
+ MachO::swapStruct(LC.load_command_data.load_command);
+ break;
+#include "llvm/Support/MachO.def"
+ }
Y->LoadCommands.push_back(std::move(LC));
}
diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp
index ed243a2cdd9..bf891a6e983 100644
--- a/llvm/tools/yaml2obj/yaml2macho.cpp
+++ b/llvm/tools/yaml2obj/yaml2macho.cpp
@@ -79,17 +79,33 @@ Error MachOWriter::writeHeader(raw_ostream &OS) {
Error MachOWriter::writeLoadCommands(raw_ostream &OS) {
for (auto &LC : Obj.LoadCommands) {
- MachO::load_command LCTemp;
- LCTemp.cmd = LC->cmd;
- LCTemp.cmdsize = LC->cmdsize;
- OS.write(reinterpret_cast<const char *>(&LCTemp),
- sizeof(MachO::load_command));
- auto remaining_size = LC->cmdsize - sizeof(MachO::load_command);
- if (remaining_size > 0) {
+ size_t BytesWritten = 0;
+#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
+ case MachO::LCName: \
+ OS.write(reinterpret_cast<const char *>(&(LC.load_command_data.LCStruct)), \
+ sizeof(MachO::LCStruct)); \
+ BytesWritten = sizeof(MachO::LCStruct); \
+ break;
+
+ switch (LC.load_command_data.load_command.cmd) {
+ default:
+ OS.write(
+ reinterpret_cast<const char *>(&(LC.load_command_data.load_command)),
+ sizeof(MachO::load_command));
+ BytesWritten = sizeof(MachO::load_command);
+ break;
+#include "llvm/Support/MachO.def"
+ }
+
+ auto BytesRemaining =
+ LC.load_command_data.load_command.cmdsize - BytesWritten;
+ if (BytesRemaining > 0) {
// TODO: Replace all this once the load command data is present in yaml.
- std::vector<char> fill_data;
- fill_data.insert(fill_data.begin(), remaining_size, 0);
- OS.write(fill_data.data(), remaining_size);
+ // For now I fill with 0xDEADBEEF because it is easy to spot on a hex
+ // viewer.
+ std::vector<uint32_t> FillData;
+ FillData.insert(FillData.begin(), BytesRemaining / 4 + 1, 0xDEADBEEFu);
+ OS.write(reinterpret_cast<char *>(FillData.data()), BytesRemaining);
}
}
return Error::success();
OpenPOWER on IntegriCloud