SmallVectorImpl<uint32_t>::const_iterator OffsetIt;
struct PartData {
dxbc::PartHeader Part;
+ uint32_t Offset;
StringRef Data;
} IteratorState;
cantFail(readStruct(Buffer, Current, IteratorState.Part));
IteratorState.Data =
StringRef(Current + sizeof(dxbc::PartHeader), IteratorState.Part.Size);
+ IteratorState.Offset = Offset;
}
--- /dev/null
+# 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: ...
--- /dev/null
+# 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: ...
obj2yaml.cpp
coff2yaml.cpp
dwarf2yaml.cpp
+ dxcontainer2yaml.cpp
elf2yaml.cpp
macho2yaml.cpp
minidump2yaml.cpp
--- /dev/null
+//===------ 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();
+}
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);
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 {