[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