[llvm] r269314 - [yaml2obj] Support for dumping mach_header from yaml

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Thu May 12 10:44:48 PDT 2016


Author: cbieneman
Date: Thu May 12 12:44:48 2016
New Revision: 269314

URL: http://llvm.org/viewvc/llvm-project?rev=269314&view=rev
Log:
[yaml2obj] Support for dumping mach_header from yaml

With this change obj2yaml and yaml2obj can now round-trip mach_headers.

This change also adds ObjectYAML/MachO tests.

Added:
    llvm/trunk/test/ObjectYAML/
    llvm/trunk/test/ObjectYAML/MachO/
    llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml
    llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml
    llvm/trunk/test/ObjectYAML/lit.local.cfg
Modified:
    llvm/trunk/tools/yaml2obj/yaml2macho.cpp

Added: llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml?rev=269314&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/mach_header.yaml Thu May 12 12:44:48 2016
@@ -0,0 +1,23 @@
+# RUN: yaml2obj -format=macho %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+FileHeader:      
+  magic:           0xFEEDFACE
+  cputype:         0x00000007
+  cpusubtype:      0x80000003
+  filetype:        0x00000002
+  ncmds:           0
+  sizeofcmds:      0
+  flags:           0x00218085
+...
+
+# CHECK: --- !mach-o
+# CHECK: FileHeader:      
+# CHECK:   magic:           0xFEEDFACE
+# CHECK:   cputype:         0x00000007
+# CHECK:   cpusubtype:      0x80000003
+# CHECK:   filetype:        0x00000002
+# CHECK:   ncmds:           0
+# CHECK:   sizeofcmds:      0
+# CHECK:   flags:           0x00218085
+# CHECK: ...

Added: llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml?rev=269314&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/mach_header_64.yaml Thu May 12 12:44:48 2016
@@ -0,0 +1,23 @@
+# RUN: yaml2obj -format=macho %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+FileHeader:      
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x80000003
+  filetype:        0x00000002
+  ncmds:           0
+  sizeofcmds:      0
+  flags:           0x00218085
+...
+
+# CHECK: --- !mach-o
+# CHECK: FileHeader:      
+# CHECK:   magic:           0xFEEDFACF
+# CHECK:   cputype:         0x01000007
+# CHECK:   cpusubtype:      0x80000003
+# CHECK:   filetype:        0x00000002
+# CHECK:   ncmds:           0
+# CHECK:   sizeofcmds:      0
+# CHECK:   flags:           0x00218085
+# CHECK: ...

Added: llvm/trunk/test/ObjectYAML/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/lit.local.cfg?rev=269314&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/lit.local.cfg (added)
+++ llvm/trunk/test/ObjectYAML/lit.local.cfg Thu May 12 12:44:48 2016
@@ -0,0 +1 @@
+config.suffixes = ['.yaml']

Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=269314&r1=269313&r2=269314&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Thu May 12 12:44:48 2016
@@ -13,11 +13,75 @@
 //===----------------------------------------------------------------------===//
 
 #include "yaml2obj.h"
+#include "llvm/ObjectYAML/MachOYAML.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/MachO.h"
+#include "llvm/Support/YAMLTraits.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace llvm;
 
-int yaml2macho(llvm::yaml::Input &YIn, llvm::raw_ostream &Out) {
-  errs() << "yaml2obj: Mach-O not implemented yet!\n";
-  return 1;
+namespace {
+
+class MachOWriter {
+public:
+  MachOWriter(MachOYAML::Object &Obj) : Obj(Obj) {
+    is64Bit = Obj.Header.magic == MachO::MH_MAGIC_64 ||
+              Obj.Header.magic == MachO::MH_CIGAM_64;
+    bzero(&Header64, sizeof(MachO::mach_header_64));
+  }
+
+  Error writeMachO(raw_ostream &OS);
+
+private:
+  Error writeHeader(raw_ostream &OS);
+
+  MachOYAML::Object Obj;
+  bool is64Bit;
+
+  union {
+    MachO::mach_header_64 Header64;
+    MachO::mach_header Header;
+  };
+};
+
+Error MachOWriter::writeMachO(raw_ostream &OS) {
+  if (auto Err = writeHeader(OS))
+    return Err;
+  return Error::success();
+}
+
+Error MachOWriter::writeHeader(raw_ostream &OS) {
+  Header.magic = Obj.Header.magic;
+  Header.cputype = Obj.Header.cputype;
+  Header.cpusubtype = Obj.Header.cpusubtype;
+  Header.filetype = Obj.Header.filetype;
+  Header.ncmds = Obj.Header.ncmds;
+  Header.sizeofcmds = Obj.Header.sizeofcmds;
+  Header.flags = Obj.Header.flags;
+
+  if (is64Bit)
+    OS.write((const char *)&Header64, sizeof(MachO::mach_header_64));
+  else
+    OS.write((const char *)&Header, sizeof(MachO::mach_header));
+
+  return Error::success();
+}
+
+} // end anonymous namespace
+
+int yaml2macho(yaml::Input &YIn, raw_ostream &Out) {
+  MachOYAML::Object Doc;
+  YIn >> Doc;
+  if (YIn.error()) {
+    errs() << "yaml2obj: Failed to parse YAML file!\n";
+    return 1;
+  }
+
+  MachOWriter Writer(Doc);
+  if (auto Err = Writer.writeMachO(Out)) {
+    errs() << toString(std::move(Err));
+    return 1;
+  }
+  return 0;
 }




More information about the llvm-commits mailing list