xref: /llvm-project/llvm/tools/llvm-objdump/OffloadDump.cpp (revision 8298f0b7b92e5e2ff8d547cd93863f094d13cb06)
1d2d8b0aaSJoseph Huber //===-- OffloadDump.cpp - Offloading dumper ---------------------*- C++ -*-===//
2d2d8b0aaSJoseph Huber //
3d2d8b0aaSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d2d8b0aaSJoseph Huber // See https://llvm.org/LICENSE.txt for license information.
5d2d8b0aaSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d2d8b0aaSJoseph Huber //
7d2d8b0aaSJoseph Huber //===----------------------------------------------------------------------===//
8d2d8b0aaSJoseph Huber ///
9d2d8b0aaSJoseph Huber /// \file
10d2d8b0aaSJoseph Huber /// This file implements the offloading-specific dumper for llvm-objdump.
11d2d8b0aaSJoseph Huber ///
12d2d8b0aaSJoseph Huber //===----------------------------------------------------------------------===//
133384f05aSJoseph Huber 
14d2d8b0aaSJoseph Huber #include "OffloadDump.h"
15d2d8b0aaSJoseph Huber #include "llvm-objdump.h"
1682a0adf0SJoseph Huber #include "llvm/Object/ELFObjectFile.h"
17e0fb9f55SJoseph Huber #include "llvm/Support/Alignment.h"
18d2d8b0aaSJoseph Huber 
19d2d8b0aaSJoseph Huber using namespace llvm;
20d2d8b0aaSJoseph Huber using namespace llvm::object;
21d2d8b0aaSJoseph Huber using namespace llvm::objdump;
22d2d8b0aaSJoseph Huber 
23d2d8b0aaSJoseph Huber /// Get the printable name of the image kind.
getImageName(const OffloadBinary & OB)24d2d8b0aaSJoseph Huber static StringRef getImageName(const OffloadBinary &OB) {
25d2d8b0aaSJoseph Huber   switch (OB.getImageKind()) {
26d2d8b0aaSJoseph Huber   case IMG_Object:
27d2d8b0aaSJoseph Huber     return "elf";
28d2d8b0aaSJoseph Huber   case IMG_Bitcode:
29d2d8b0aaSJoseph Huber     return "llvm ir";
30d2d8b0aaSJoseph Huber   case IMG_Cubin:
31d2d8b0aaSJoseph Huber     return "cubin";
32d2d8b0aaSJoseph Huber   case IMG_Fatbinary:
33d2d8b0aaSJoseph Huber     return "fatbinary";
34d2d8b0aaSJoseph Huber   case IMG_PTX:
35d2d8b0aaSJoseph Huber     return "ptx";
36d2d8b0aaSJoseph Huber   default:
37d2d8b0aaSJoseph Huber     return "<none>";
38d2d8b0aaSJoseph Huber   }
39d2d8b0aaSJoseph Huber }
40d2d8b0aaSJoseph Huber 
printBinary(const OffloadBinary & OB,uint64_t Index)41d2d8b0aaSJoseph Huber static void printBinary(const OffloadBinary &OB, uint64_t Index) {
42d2d8b0aaSJoseph Huber   outs() << "\nOFFLOADING IMAGE [" << Index << "]:\n";
43d2d8b0aaSJoseph Huber   outs() << left_justify("kind", 16) << getImageName(OB) << "\n";
44d2d8b0aaSJoseph Huber   outs() << left_justify("arch", 16) << OB.getArch() << "\n";
45d2d8b0aaSJoseph Huber   outs() << left_justify("triple", 16) << OB.getTriple() << "\n";
46d2d8b0aaSJoseph Huber   outs() << left_justify("producer", 16)
47d2d8b0aaSJoseph Huber          << getOffloadKindName(OB.getOffloadKind()) << "\n";
48d2d8b0aaSJoseph Huber }
49d2d8b0aaSJoseph Huber 
50d2d8b0aaSJoseph Huber /// Print the embedded offloading contents of an ObjectFile \p O.
dumpOffloadBinary(const ObjectFile & O)51d2d8b0aaSJoseph Huber void llvm::dumpOffloadBinary(const ObjectFile &O) {
52*8298f0b7SJoseph Huber   if (!O.isELF() && !O.isCOFF()) {
53*8298f0b7SJoseph Huber     reportWarning(
54*8298f0b7SJoseph Huber         "--offloading is currently only supported for COFF and ELF targets",
5582a0adf0SJoseph Huber         O.getFileName());
5682a0adf0SJoseph Huber     return;
5782a0adf0SJoseph Huber   }
5882a0adf0SJoseph Huber 
593384f05aSJoseph Huber   SmallVector<OffloadFile> Binaries;
603384f05aSJoseph Huber   if (Error Err = extractOffloadBinaries(O.getMemoryBufferRef(), Binaries))
61d2d8b0aaSJoseph Huber     reportError(O.getFileName(), "while extracting offloading files: " +
623384f05aSJoseph Huber                                      toString(std::move(Err)));
63d2d8b0aaSJoseph Huber 
643384f05aSJoseph Huber   // Print out all the binaries that are contained in this buffer.
653384f05aSJoseph Huber   for (uint64_t I = 0, E = Binaries.size(); I != E; ++I)
663384f05aSJoseph Huber     printBinary(*Binaries[I].getBinary(), I);
67d2d8b0aaSJoseph Huber }
68d2d8b0aaSJoseph Huber 
69d2d8b0aaSJoseph Huber /// Print the contents of an offload binary file \p OB. This may contain
70d2d8b0aaSJoseph Huber /// multiple binaries stored in the same buffer.
dumpOffloadSections(const OffloadBinary & OB)71d2d8b0aaSJoseph Huber void llvm::dumpOffloadSections(const OffloadBinary &OB) {
723384f05aSJoseph Huber   SmallVector<OffloadFile> Binaries;
733384f05aSJoseph Huber   if (Error Err = extractOffloadBinaries(OB.getMemoryBufferRef(), Binaries))
743384f05aSJoseph Huber     reportError(OB.getFileName(), "while extracting offloading files: " +
753384f05aSJoseph Huber                                       toString(std::move(Err)));
763384f05aSJoseph Huber 
773384f05aSJoseph Huber   // Print out all the binaries that are contained in this buffer.
783384f05aSJoseph Huber   for (uint64_t I = 0, E = Binaries.size(); I != E; ++I)
793384f05aSJoseph Huber     printBinary(*Binaries[I].getBinary(), I);
80d2d8b0aaSJoseph Huber }
81