181ad6265SDimitry Andric //===-- OffloadDump.cpp - Offloading dumper ---------------------*- C++ -*-===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric ///
981ad6265SDimitry Andric /// \file
1081ad6265SDimitry Andric /// This file implements the offloading-specific dumper for llvm-objdump.
1181ad6265SDimitry Andric ///
1281ad6265SDimitry Andric //===----------------------------------------------------------------------===//
13*bdd1243dSDimitry Andric 
1481ad6265SDimitry Andric #include "OffloadDump.h"
1581ad6265SDimitry Andric #include "llvm-objdump.h"
16753f127fSDimitry Andric #include "llvm/Object/ELFObjectFile.h"
17753f127fSDimitry Andric #include "llvm/Support/Alignment.h"
1881ad6265SDimitry Andric 
1981ad6265SDimitry Andric using namespace llvm;
2081ad6265SDimitry Andric using namespace llvm::object;
2181ad6265SDimitry Andric using namespace llvm::objdump;
2281ad6265SDimitry Andric 
2381ad6265SDimitry Andric /// Get the printable name of the image kind.
getImageName(const OffloadBinary & OB)2481ad6265SDimitry Andric static StringRef getImageName(const OffloadBinary &OB) {
2581ad6265SDimitry Andric   switch (OB.getImageKind()) {
2681ad6265SDimitry Andric   case IMG_Object:
2781ad6265SDimitry Andric     return "elf";
2881ad6265SDimitry Andric   case IMG_Bitcode:
2981ad6265SDimitry Andric     return "llvm ir";
3081ad6265SDimitry Andric   case IMG_Cubin:
3181ad6265SDimitry Andric     return "cubin";
3281ad6265SDimitry Andric   case IMG_Fatbinary:
3381ad6265SDimitry Andric     return "fatbinary";
3481ad6265SDimitry Andric   case IMG_PTX:
3581ad6265SDimitry Andric     return "ptx";
3681ad6265SDimitry Andric   default:
3781ad6265SDimitry Andric     return "<none>";
3881ad6265SDimitry Andric   }
3981ad6265SDimitry Andric }
4081ad6265SDimitry Andric 
printBinary(const OffloadBinary & OB,uint64_t Index)4181ad6265SDimitry Andric static void printBinary(const OffloadBinary &OB, uint64_t Index) {
4281ad6265SDimitry Andric   outs() << "\nOFFLOADING IMAGE [" << Index << "]:\n";
4381ad6265SDimitry Andric   outs() << left_justify("kind", 16) << getImageName(OB) << "\n";
4481ad6265SDimitry Andric   outs() << left_justify("arch", 16) << OB.getArch() << "\n";
4581ad6265SDimitry Andric   outs() << left_justify("triple", 16) << OB.getTriple() << "\n";
4681ad6265SDimitry Andric   outs() << left_justify("producer", 16)
4781ad6265SDimitry Andric          << getOffloadKindName(OB.getOffloadKind()) << "\n";
4881ad6265SDimitry Andric }
4981ad6265SDimitry Andric 
5081ad6265SDimitry Andric /// Print the embedded offloading contents of an ObjectFile \p O.
dumpOffloadBinary(const ObjectFile & O)5181ad6265SDimitry Andric void llvm::dumpOffloadBinary(const ObjectFile &O) {
52*bdd1243dSDimitry Andric   if (!O.isELF() && !O.isCOFF()) {
53*bdd1243dSDimitry Andric     reportWarning(
54*bdd1243dSDimitry Andric         "--offloading is currently only supported for COFF and ELF targets",
55753f127fSDimitry Andric         O.getFileName());
56753f127fSDimitry Andric     return;
57753f127fSDimitry Andric   }
58753f127fSDimitry Andric 
59*bdd1243dSDimitry Andric   SmallVector<OffloadFile> Binaries;
60*bdd1243dSDimitry Andric   if (Error Err = extractOffloadBinaries(O.getMemoryBufferRef(), Binaries))
6181ad6265SDimitry Andric     reportError(O.getFileName(), "while extracting offloading files: " +
62*bdd1243dSDimitry Andric                                      toString(std::move(Err)));
6381ad6265SDimitry Andric 
64*bdd1243dSDimitry Andric   // Print out all the binaries that are contained in this buffer.
65*bdd1243dSDimitry Andric   for (uint64_t I = 0, E = Binaries.size(); I != E; ++I)
66*bdd1243dSDimitry Andric     printBinary(*Binaries[I].getBinary(), I);
6781ad6265SDimitry Andric }
6881ad6265SDimitry Andric 
6981ad6265SDimitry Andric /// Print the contents of an offload binary file \p OB. This may contain
7081ad6265SDimitry Andric /// multiple binaries stored in the same buffer.
dumpOffloadSections(const OffloadBinary & OB)7181ad6265SDimitry Andric void llvm::dumpOffloadSections(const OffloadBinary &OB) {
72*bdd1243dSDimitry Andric   SmallVector<OffloadFile> Binaries;
73*bdd1243dSDimitry Andric   if (Error Err = extractOffloadBinaries(OB.getMemoryBufferRef(), Binaries))
74*bdd1243dSDimitry Andric     reportError(OB.getFileName(), "while extracting offloading files: " +
75*bdd1243dSDimitry Andric                                       toString(std::move(Err)));
76*bdd1243dSDimitry Andric 
77*bdd1243dSDimitry Andric   // Print out all the binaries that are contained in this buffer.
78*bdd1243dSDimitry Andric   for (uint64_t I = 0, E = Binaries.size(); I != E; ++I)
79*bdd1243dSDimitry Andric     printBinary(*Binaries[I].getBinary(), I);
8081ad6265SDimitry Andric }
81