Coverage Report

Created: 2019-07-24 05:18

/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
// 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
// COFF short import file is a special kind of file which contains
10
// only symbol names for DLL-exported symbols. This class implements
11
// exporting of Symbols to create libraries and a SymbolicFile
12
// interface for the file type.
13
//
14
//===----------------------------------------------------------------------===//
15
16
#ifndef LLVM_OBJECT_COFF_IMPORT_FILE_H
17
#define LLVM_OBJECT_COFF_IMPORT_FILE_H
18
19
#include "llvm/ADT/ArrayRef.h"
20
#include "llvm/Object/COFF.h"
21
#include "llvm/Object/IRObjectFile.h"
22
#include "llvm/Object/ObjectFile.h"
23
#include "llvm/Object/SymbolicFile.h"
24
#include "llvm/Support/MemoryBuffer.h"
25
#include "llvm/Support/raw_ostream.h"
26
27
namespace llvm {
28
namespace object {
29
30
class COFFImportFile : public SymbolicFile {
31
public:
32
  COFFImportFile(MemoryBufferRef Source)
33
316
      : SymbolicFile(ID_COFFImportFile, Source) {}
34
35
  static bool classof(Binary const *V) { return V->isCOFFImportFile(); }
36
37
607
  void moveSymbolNext(DataRefImpl &Symb) const override { ++Symb.p; }
38
39
607
  Error printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override {
40
607
    if (Symb.p == 0)
41
313
      OS << "__imp_";
42
607
    OS << StringRef(Data.getBufferStart() + sizeof(coff_import_header));
43
607
    return Error::success();
44
607
  }
45
46
563
  uint32_t getSymbolFlags(DataRefImpl Symb) const override {
47
563
    return SymbolRef::SF_Global;
48
563
  }
49
50
313
  basic_symbol_iterator symbol_begin() const override {
51
313
    return BasicSymbolRef(DataRefImpl(), this);
52
313
  }
53
54
313
  basic_symbol_iterator symbol_end() const override {
55
313
    DataRefImpl Symb;
56
313
    Symb.p = isData() ? 
119
:
2294
;
57
313
    return BasicSymbolRef(Symb, this);
58
313
  }
59
60
411
  const coff_import_header *getCOFFImportHeader() const {
61
411
    return reinterpret_cast<const object::coff_import_header *>(
62
411
        Data.getBufferStart());
63
411
  }
64
65
private:
66
313
  bool isData() const {
67
313
    return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA;
68
313
  }
69
};
70
71
struct COFFShortExport {
72
  /// The name of the export as specified in the .def file or on the command
73
  /// line, i.e. "foo" in "/EXPORT:foo", and "bar" in "/EXPORT:foo=bar". This
74
  /// may lack mangling, such as underscore prefixing and stdcall suffixing.
75
  std::string Name;
76
77
  /// The external, exported name. Only non-empty when export renaming is in
78
  /// effect, i.e. "foo" in "/EXPORT:foo=bar".
79
  std::string ExtName;
80
81
  /// The real, mangled symbol name from the object file. Given
82
  /// "/export:foo=bar", this could be "_bar@8" if bar is stdcall.
83
  std::string SymbolName;
84
85
  /// Creates a weak alias. This is the name of the weak aliasee. In a .def
86
  /// file, this is "baz" in "EXPORTS\nfoo = bar == baz".
87
  std::string AliasTarget;
88
89
  uint16_t Ordinal = 0;
90
  bool Noname = false;
91
  bool Data = false;
92
  bool Private = false;
93
  bool Constant = false;
94
95
0
  friend bool operator==(const COFFShortExport &L, const COFFShortExport &R) {
96
0
    return L.Name == R.Name && L.ExtName == R.ExtName &&
97
0
            L.Ordinal == R.Ordinal && L.Noname == R.Noname &&
98
0
            L.Data == R.Data && L.Private == R.Private;
99
0
  }
100
101
0
  friend bool operator!=(const COFFShortExport &L, const COFFShortExport &R) {
102
0
    return !(L == R);
103
0
  }
104
};
105
106
Error writeImportLibrary(StringRef ImportName, StringRef Path,
107
                         ArrayRef<COFFShortExport> Exports,
108
                         COFF::MachineTypes Machine, bool MinGW);
109
110
} // namespace object
111
} // namespace llvm
112
113
#endif