From 352c395fb6856fc45157d6f34b2a3d6163275a2e Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Tue, 3 May 2022 13:17:15 -0500 Subject: [PATCH] [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 --- llvm/include/llvm/Object/DXContainer.h | 1 + llvm/lib/Object/DXContainer.cpp | 1 + .../DXContainer/ExplicitSizeAndOffsets.yaml | 55 ++++++++++++++++++++ .../obj2yaml/DXContainer/OmitSizeAndOffsets.yaml | 53 +++++++++++++++++++ llvm/tools/obj2yaml/CMakeLists.txt | 1 + llvm/tools/obj2yaml/dxcontainer2yaml.cpp | 59 ++++++++++++++++++++++ llvm/tools/obj2yaml/obj2yaml.cpp | 8 ++- llvm/tools/obj2yaml/obj2yaml.h | 2 + 8 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/obj2yaml/DXContainer/ExplicitSizeAndOffsets.yaml create mode 100644 llvm/test/tools/obj2yaml/DXContainer/OmitSizeAndOffsets.yaml create mode 100644 llvm/tools/obj2yaml/dxcontainer2yaml.cpp diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index b3b153a..3877abf 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -44,6 +44,7 @@ public: SmallVectorImpl::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 9fda608..2a5281c 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 0000000..f807aeff --- /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 0000000..3930afa --- /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 9bd86a7..c948d49 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 0000000..0d79baa --- /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.cpp b/llvm/tools/obj2yaml/obj2yaml.cpp index 9c7a338..769983a 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 &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); diff --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h index c026482..8d4e6e2 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 { -- 2.7.4