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