Welcome to mirror list, hosted at ThFree Co, Russian Federation.

DLL.h « COFF « lld - github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f0f5969747893b57f9560ae92e2b409d0e6b5ea2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//===- DLL.h -------------------------------------------------------------===//
//
//                             The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLD_COFF_DLL_H
#define LLD_COFF_DLL_H

#include "Chunks.h"
#include "Symbols.h"

namespace lld {
namespace coff {

// Windows-specific.
// IdataContents creates all chunks for the DLL import table.
// You are supposed to call add() to add symbols and then
// call getChunks() to get a list of chunks.
class IdataContents {
public:
  void add(DefinedImportData *Sym) { Imports.push_back(Sym); }
  bool empty() { return Imports.empty(); }
  std::vector<Chunk *> getChunks();

  uint64_t getDirRVA() { return Dirs[0]->getRVA(); }
  uint64_t getDirSize();
  uint64_t getIATRVA() { return Addresses[0]->getRVA(); }
  uint64_t getIATSize();

private:
  void create();

  std::vector<DefinedImportData *> Imports;
  std::vector<std::unique_ptr<Chunk>> Dirs;
  std::vector<std::unique_ptr<Chunk>> Lookups;
  std::vector<std::unique_ptr<Chunk>> Addresses;
  std::vector<std::unique_ptr<Chunk>> Hints;
  std::map<StringRef, std::unique_ptr<Chunk>> DLLNames;
};

// Windows-specific.
// DelayLoadContents creates all chunks for the delay-load DLL import table.
class DelayLoadContents {
public:
  void add(DefinedImportData *Sym) { Imports.push_back(Sym); }
  bool empty() { return Imports.empty(); }
  void create(Defined *Helper);
  std::vector<Chunk *> getChunks();
  std::vector<Chunk *> getDataChunks();
  std::vector<std::unique_ptr<Chunk>> &getCodeChunks() { return Thunks; }

  uint64_t getDirRVA() { return Dirs[0]->getRVA(); }
  uint64_t getDirSize();

private:
  Defined *Helper;
  std::vector<DefinedImportData *> Imports;
  std::vector<std::unique_ptr<Chunk>> Dirs;
  std::vector<std::unique_ptr<Chunk>> ModuleHandles;
  std::vector<std::unique_ptr<Chunk>> Addresses;
  std::vector<std::unique_ptr<Chunk>> Names;
  std::vector<std::unique_ptr<Chunk>> HintNames;
  std::vector<std::unique_ptr<Chunk>> Thunks;
  std::map<StringRef, std::unique_ptr<Chunk>> DLLNames;
};

// Windows-specific.
// EdataContents creates all chunks for the DLL export table.
class EdataContents {
public:
  EdataContents();
  std::vector<std::unique_ptr<Chunk>> Chunks;
};

} // namespace coff
} // namespace lld

#endif