diff --git a/llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml b/llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml new file mode 100644 --- /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: DXIL + 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: DXIL +# 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 --- /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: DXIL + 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: DXIL +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: ... diff --git a/llvm/tools/obj2yaml/CMakeLists.txt b/llvm/tools/obj2yaml/CMakeLists.txt --- a/llvm/tools/obj2yaml/CMakeLists.txt +++ b/llvm/tools/obj2yaml/CMakeLists.txt @@ -12,6 +12,7 @@ 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 --- /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 + +using namespace llvm; +using namespace llvm::object; + +static Expected +dumpDXContainer(MemoryBufferRef Source) { + assert(file_magic::dxcontainer_object == identify_magic(Source.getBuffer())); + + Expected ExDXC = DXContainer::create(Source); + if (!ExDXC) + return ExDXC.takeError(); + DXContainer Container = *ExDXC; + + std::unique_ptr Obj = + std::make_unique(); + + 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(); + 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 YAMLOrErr = dumpDXContainer(Source); + if (!YAMLOrErr) + return YAMLOrErr.takeError(); + + std::unique_ptr YAML(YAMLOrErr.get()); + yaml::Output Yout(Out); + Yout << *YAML; + + return Error::success(); +} diff --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h --- a/llvm/tools/obj2yaml/obj2yaml.h +++ b/llvm/tools/obj2yaml/obj2yaml.h @@ -34,6 +34,8 @@ 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 { diff --git a/llvm/tools/obj2yaml/obj2yaml.cpp b/llvm/tools/obj2yaml/obj2yaml.cpp --- a/llvm/tools/obj2yaml/obj2yaml.cpp +++ b/llvm/tools/obj2yaml/obj2yaml.cpp @@ -50,8 +50,14 @@ return errorCodeToError(EC); std::unique_ptr &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> BinOrErr = createBinary(MemBuf, /*Context=*/nullptr);