Coverage Report

Created: 2018-09-17 19:50

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Object/COFFImportFile.h
Line
Count
Source (jump to first uncovered line)
1
//===- COFFImportFile.h - COFF short import file implementation -*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// COFF short import file is a special kind of file which contains
11
// only symbol names for DLL-exported symbols. This class implements
12
// exporting of Symbols to create libraries and a SymbolicFile
13
// interface for the file type.
14
//
15
//===----------------------------------------------------------------------===//
16
17
#ifndef LLVM_OBJECT_COFF_IMPORT_FILE_H
18
#define LLVM_OBJECT_COFF_IMPORT_FILE_H
19
20
#include "llvm/ADT/ArrayRef.h"
21
#include "llvm/Object/COFF.h"
22
#include "llvm/Object/IRObjectFile.h"
23
#include "llvm/Object/ObjectFile.h"
24
#include "llvm/Object/SymbolicFile.h"
25
#include "llvm/Support/MemoryBuffer.h"
26
#include "llvm/Support/raw_ostream.h"
27
28
namespace llvm {
29
namespace object {
30
31
class COFFImportFile : public SymbolicFile {
32
public:
33
  COFFImportFile(MemoryBufferRef Source)
34
284
      : SymbolicFile(ID_COFFImportFile, Source) {}
35
36
  static bool classof(Binary const *V) { return V->isCOFFImportFile(); }
37
38
545
  void moveSymbolNext(DataRefImpl &Symb) const override { ++Symb.p; }
39
40
  std::error_code printSymbolName(raw_ostream &OS,
41
545
                                  DataRefImpl Symb) const override {
42
545
    if (Symb.p == 0)
43
281
      OS << "__imp_";
44
545
    OS << StringRef(Data.getBufferStart() + sizeof(coff_import_header));
45
545
    return std::error_code();
46
545
  }
47
48
500
  uint32_t getSymbolFlags(DataRefImpl Symb) const override {
49
500
    return SymbolRef::SF_Global;
50
500
  }
51
52
281
  basic_symbol_iterator symbol_begin() const override {
53
281
    return BasicSymbolRef(DataRefImpl(), this);
54
281
  }
55
56
281
  basic_symbol_iterator symbol_end() const override {
57
281
    DataRefImpl Symb;
58
281
    Symb.p = isData() ? 
117
:
2264
;
59
281
    return BasicSymbolRef(Symb, this);
60
281
  }
61
62
369
  const coff_import_header *getCOFFImportHeader() const {
63
369
    return reinterpret_cast<const object::coff_import_header *>(
64
369
        Data.getBufferStart());
65
369
  }
66
67
private:
68
281
  bool isData() const {
69
281
    return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA;
70
281
  }
71
};
72
73
struct COFFShortExport {
74
  std::string Name;
75
  std::string ExtName;
76
  std::string SymbolName;
77
  std::string AliasTarget;
78
79
  uint16_t Ordinal = 0;
80
  bool Noname = false;
81
  bool Data = false;
82
  bool Private = false;
83
  bool Constant = false;
84
85
0
  friend bool operator==(const COFFShortExport &L, const COFFShortExport &R) {
86
0
    return L.Name == R.Name && L.ExtName == R.ExtName &&
87
0
            L.Ordinal == R.Ordinal && L.Noname == R.Noname &&
88
0
            L.Data == R.Data && L.Private == R.Private;
89
0
  }
90
91
0
  friend bool operator!=(const COFFShortExport &L, const COFFShortExport &R) {
92
0
    return !(L == R);
93
0
  }
94
};
95
96
Error writeImportLibrary(StringRef ImportName, StringRef Path,
97
                         ArrayRef<COFFShortExport> Exports,
98
                         COFF::MachineTypes Machine, bool MinGW);
99
100
} // namespace object
101
} // namespace llvm
102
103
#endif