[llvm] 352c395 - [ObjectYAML][DX] Add dxcontainer2yaml support

Chris Bieneman via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 6 11:24:55 PDT 2022


Author: Chris Bieneman
Date: 2022-06-06T13:23:29-05:00
New Revision: 352c395fb6856fc45157d6f34b2a3d6163275a2e

URL: https://github.com/llvm/llvm-project/commit/352c395fb6856fc45157d6f34b2a3d6163275a2e
DIFF: https://github.com/llvm/llvm-project/commit/352c395fb6856fc45157d6f34b2a3d6163275a2e.diff

LOG: [ObjectYAML][DX] Add dxcontainer2yaml support

This change finishes fleshing out the ObjectYAML tools to support
converting DXContainer files into yaml representations.

Depends on D124944

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D124945

Added: 
    llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml
    llvm/test/tools/obj2yaml/DXContainer/OmitSizeAndOffsets.yaml
    llvm/tools/obj2yaml/dxcontainer2yaml.cpp

Modified: 
    llvm/include/llvm/Object/DXContainer.h
    llvm/lib/Object/DXContainer.cpp
    llvm/tools/obj2yaml/CMakeLists.txt
    llvm/tools/obj2yaml/obj2yaml.cpp
    llvm/tools/obj2yaml/obj2yaml.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index b3b153a12568..3877abf13801 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -44,6 +44,7 @@ class DXContainer {
     SmallVectorImpl<uint32_t>::const_iterator OffsetIt;
     struct PartData {
       dxbc::PartHeader Part;
+      uint32_t Offset;
       StringRef Data;
     } IteratorState;
 

diff  --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 9fda608eee0b..2a5281c07331 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -89,4 +89,5 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
   cantFail(readStruct(Buffer, Current, IteratorState.Part));
   IteratorState.Data =
       StringRef(Current + sizeof(dxbc::PartHeader), IteratorState.Part.Size);
+  IteratorState.Offset = Offset;
 }

diff  --git a/llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml b/llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml
new file mode 100644
index 000000000000..f807aeffc5dd
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml
@@ -0,0 +1,55 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s 
+
+--- !dxcontainer
+Header:
+  Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  Version:
+    Major:           1
+    Minor:           0
+  FileSize:        172
+  PartCount:       7
+  PartOffsets:     [ 60, 76, 92, 108, 124, 140, 156 ]
+Parts:
+  - Name:            SFI0
+    Size:            8
+  - Name:            ISG1
+    Size:            8
+  - Name:            OSG1
+    Size:            8
+  - Name:            PSV0
+    Size:            8
+  - Name:            STAT
+    Size:            8
+  - Name:            HASH
+    Size:            8
+  - Name:            CXIL
+    Size:            8
+...
+
+# CHECK: --- !dxcontainer
+# CHECK-NEXT: Header:
+# CHECK-NEXT:   Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+# CHECK-NEXT:                      0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+# CHECK-NEXT:   Version:
+# CHECK-NEXT:     Major:           1
+# CHECK-NEXT:     Minor:           0
+# CHECK-NEXT:   FileSize:        172
+# CHECK-NEXT:   PartCount:       7
+# CHECK-NEXT:   PartOffsets:     [ 60, 76, 92, 108, 124, 140, 156 ]
+# CHECK-NEXT: Parts:
+# CHECK-NEXT:   - Name:            SFI0
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            ISG1
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            OSG1
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            PSV0
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            STAT
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            HASH
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            CXIL
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT: ...

diff  --git a/llvm/test/tools/obj2yaml/DXContainer/OmitSizeAndOffsets.yaml b/llvm/test/tools/obj2yaml/DXContainer/OmitSizeAndOffsets.yaml
new file mode 100644
index 000000000000..3930afab0789
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/DXContainer/OmitSizeAndOffsets.yaml
@@ -0,0 +1,53 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s 
+
+--- !dxcontainer
+Header:
+  Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  Version:
+    Major:           1
+    Minor:           0
+  PartCount:       7
+Parts:
+  - Name:            SFI0
+    Size:            8
+  - Name:            ISG1
+    Size:            8
+  - Name:            OSG1
+    Size:            8
+  - Name:            PSV0
+    Size:            8
+  - Name:            STAT
+    Size:            8
+  - Name:            HASH
+    Size:            8
+  - Name:            CXIL
+    Size:            8
+...
+
+# CHECK: --- !dxcontainer
+# CHECK-NEXT: Header:
+# CHECK-NEXT:   Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+# CHECK-NEXT:                      0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+# CHECK-NEXT:   Version:
+# CHECK-NEXT:     Major:           1
+# CHECK-NEXT:     Minor:           0
+# CHECK-NEXT:   FileSize:        172
+# CHECK-NEXT:   PartCount:       7
+# CHECK-NEXT:   PartOffsets:     [ 60, 76, 92, 108, 124, 140, 156 ]
+# CHECK-NEXT: Parts:
+# CHECK-NEXT:   - Name:            SFI0
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            ISG1
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            OSG1
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            PSV0
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            STAT
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            HASH
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT:   - Name:            CXIL
+# CHECK-NEXT:     Size:            8
+# CHECK-NEXT: ...

diff  --git a/llvm/tools/obj2yaml/CMakeLists.txt b/llvm/tools/obj2yaml/CMakeLists.txt
index 9bd86a77dbe3..c948d49a449d 100644
--- a/llvm/tools/obj2yaml/CMakeLists.txt
+++ b/llvm/tools/obj2yaml/CMakeLists.txt
@@ -12,6 +12,7 @@ add_llvm_utility(obj2yaml
   obj2yaml.cpp
   coff2yaml.cpp
   dwarf2yaml.cpp
+  dxcontainer2yaml.cpp
   elf2yaml.cpp
   macho2yaml.cpp
   minidump2yaml.cpp

diff  --git a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
new file mode 100644
index 000000000000..0d79baa4db2a
--- /dev/null
+++ b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
@@ -0,0 +1,59 @@
+//===------ dxcontainer2yaml.cpp - obj2yaml conversion tool -----*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "obj2yaml.h"
+#include "llvm/Object/DXContainer.h"
+#include "llvm/ObjectYAML/DXContainerYAML.h"
+#include "llvm/Support/Error.h"
+
+#include <algorithm>
+
+using namespace llvm;
+using namespace llvm::object;
+
+static Expected<DXContainerYAML::Object *>
+dumpDXContainer(MemoryBufferRef Source) {
+  assert(file_magic::dxcontainer_object == identify_magic(Source.getBuffer()));
+
+  Expected<DXContainer> ExDXC = DXContainer::create(Source);
+  if (!ExDXC)
+    return ExDXC.takeError();
+  DXContainer Container = *ExDXC;
+
+  std::unique_ptr<DXContainerYAML::Object> Obj =
+      std::make_unique<DXContainerYAML::Object>();
+
+  for (uint8_t Byte : Container.getHeader().FileHash.Digest)
+    Obj->Header.Hash.push_back(Byte);
+  Obj->Header.Version.Major = Container.getHeader().Version.Major;
+  Obj->Header.Version.Minor = Container.getHeader().Version.Minor;
+  Obj->Header.FileSize = Container.getHeader().FileSize;
+  Obj->Header.PartCount = Container.getHeader().PartCount;
+
+  Obj->Header.PartOffsets = std::vector<uint32_t>();
+  for (const auto P : Container) {
+    Obj->Header.PartOffsets->push_back(P.Offset);
+    Obj->Parts.push_back(
+        DXContainerYAML::Part{P.Part.getName().str(), P.Part.Size});
+  }
+
+  return Obj.release();
+}
+
+llvm::Error dxcontainer2yaml(llvm::raw_ostream &Out,
+                             llvm::MemoryBufferRef Source) {
+  Expected<DXContainerYAML::Object *> YAMLOrErr = dumpDXContainer(Source);
+  if (!YAMLOrErr)
+    return YAMLOrErr.takeError();
+
+  std::unique_ptr<DXContainerYAML::Object> YAML(YAMLOrErr.get());
+  yaml::Output Yout(Out);
+  Yout << *YAML;
+
+  return Error::success();
+}

diff  --git a/llvm/tools/obj2yaml/obj2yaml.cpp b/llvm/tools/obj2yaml/obj2yaml.cpp
index 9c7a3385850d..769983a5176d 100644
--- a/llvm/tools/obj2yaml/obj2yaml.cpp
+++ b/llvm/tools/obj2yaml/obj2yaml.cpp
@@ -50,8 +50,14 @@ static Error dumpInput(StringRef File) {
     return errorCodeToError(EC);
   std::unique_ptr<MemoryBuffer> &Buffer = FileOrErr.get();
   MemoryBufferRef MemBuf = Buffer->getMemBufferRef();
-  if (file_magic::archive == identify_magic(MemBuf.getBuffer()))
+  switch (identify_magic(MemBuf.getBuffer())) {
+  case file_magic::archive:
     return archive2yaml(outs(), MemBuf);
+  case file_magic::dxcontainer_object:
+    return dxcontainer2yaml(outs(), MemBuf);
+  default:
+    break;
+  }
 
   Expected<std::unique_ptr<Binary>> BinOrErr =
       createBinary(MemBuf, /*Context=*/nullptr);

diff  --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h
index c026482eaf0c..8d4e6e2e028b 100644
--- a/llvm/tools/obj2yaml/obj2yaml.h
+++ b/llvm/tools/obj2yaml/obj2yaml.h
@@ -34,6 +34,8 @@ llvm::Error xcoff2yaml(llvm::raw_ostream &Out,
 std::error_code wasm2yaml(llvm::raw_ostream &Out,
                           const llvm::object::WasmObjectFile &Obj);
 llvm::Error archive2yaml(llvm::raw_ostream &Out, llvm::MemoryBufferRef Source);
+llvm::Error dxcontainer2yaml(llvm::raw_ostream &Out,
+                             llvm::MemoryBufferRef Source);
 
 // Forward decls for dwarf2yaml
 namespace llvm {


        


More information about the llvm-commits mailing list