1//===-- COFFImportDumper.cpp - COFF import library 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 COFF import library dumper for llvm-readobj.
11///
12//===----------------------------------------------------------------------===//
13
14#include "llvm/BinaryFormat/COFF.h"
15#include "llvm/Object/COFF.h"
16#include "llvm/Object/COFFImportFile.h"
17#include "llvm/Support/ScopedPrinter.h"
18
19using namespace llvm::object;
20
21namespace llvm {
22
23void dumpCOFFImportFile(const COFFImportFile *File, ScopedPrinter &Writer) {
24 Writer.startLine() << '\n';
25 Writer.printString(Label: "File", Value: File->getFileName());
26 Writer.printString(Label: "Format", Value: File->getFileFormatName());
27
28 const coff_import_header *H = File->getCOFFImportHeader();
29 switch (H->getType()) {
30 case COFF::IMPORT_CODE: Writer.printString(Label: "Type", Value: "code"); break;
31 case COFF::IMPORT_DATA: Writer.printString(Label: "Type", Value: "data"); break;
32 case COFF::IMPORT_CONST: Writer.printString(Label: "Type", Value: "const"); break;
33 }
34
35 switch (H->getNameType()) {
36 case COFF::IMPORT_ORDINAL:
37 Writer.printString(Label: "Name type", Value: "ordinal");
38 break;
39 case COFF::IMPORT_NAME:
40 Writer.printString(Label: "Name type", Value: "name");
41 break;
42 case COFF::IMPORT_NAME_NOPREFIX:
43 Writer.printString(Label: "Name type", Value: "noprefix");
44 break;
45 case COFF::IMPORT_NAME_UNDECORATE:
46 Writer.printString(Label: "Name type", Value: "undecorate");
47 break;
48 case COFF::IMPORT_NAME_EXPORTAS:
49 Writer.printString(Label: "Name type", Value: "export as");
50 break;
51 }
52
53 if (H->getNameType() != COFF::IMPORT_ORDINAL)
54 Writer.printString(Label: "Export name", Value: File->getExportName());
55
56 for (const object::BasicSymbolRef &Sym : File->symbols()) {
57 raw_ostream &OS = Writer.startLine();
58 OS << "Symbol: ";
59 cantFail(Err: Sym.printName(OS));
60 OS << "\n";
61 }
62}
63
64} // namespace llvm
65