Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lld/COFF/DLL.h
34870 views
1
//===- DLL.h ----------------------------------------------------*- 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
#ifndef LLD_COFF_DLL_H
10
#define LLD_COFF_DLL_H
11
12
#include "Chunks.h"
13
#include "Symbols.h"
14
15
namespace lld::coff {
16
17
// Windows-specific.
18
// IdataContents creates all chunks for the DLL import table.
19
// You are supposed to call add() to add symbols and then
20
// call create() to populate the chunk vectors.
21
class IdataContents {
22
public:
23
void add(DefinedImportData *sym) { imports.push_back(sym); }
24
bool empty() { return imports.empty(); }
25
26
void create(COFFLinkerContext &ctx);
27
28
std::vector<DefinedImportData *> imports;
29
std::vector<Chunk *> dirs;
30
std::vector<Chunk *> lookups;
31
std::vector<Chunk *> addresses;
32
std::vector<Chunk *> hints;
33
std::vector<Chunk *> dllNames;
34
};
35
36
// Windows-specific.
37
// DelayLoadContents creates all chunks for the delay-load DLL import table.
38
class DelayLoadContents {
39
public:
40
DelayLoadContents(COFFLinkerContext &ctx) : ctx(ctx) {}
41
void add(DefinedImportData *sym) { imports.push_back(sym); }
42
bool empty() { return imports.empty(); }
43
void create(Defined *helper);
44
std::vector<Chunk *> getChunks();
45
std::vector<Chunk *> getDataChunks();
46
ArrayRef<Chunk *> getCodeChunks() { return thunks; }
47
ArrayRef<Chunk *> getCodePData() { return pdata; }
48
ArrayRef<Chunk *> getCodeUnwindInfo() { return unwindinfo; }
49
50
uint64_t getDirRVA() { return dirs[0]->getRVA(); }
51
uint64_t getDirSize();
52
53
private:
54
Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
55
Chunk *newTailMergeChunk(Chunk *dir);
56
Chunk *newTailMergePDataChunk(Chunk *tm, Chunk *unwind);
57
Chunk *newTailMergeUnwindInfoChunk();
58
59
Defined *helper;
60
std::vector<DefinedImportData *> imports;
61
std::vector<Chunk *> dirs;
62
std::vector<Chunk *> moduleHandles;
63
std::vector<Chunk *> addresses;
64
std::vector<Chunk *> names;
65
std::vector<Chunk *> hintNames;
66
std::vector<Chunk *> thunks;
67
std::vector<Chunk *> pdata;
68
std::vector<Chunk *> unwindinfo;
69
std::vector<Chunk *> dllNames;
70
71
COFFLinkerContext &ctx;
72
};
73
74
// Windows-specific.
75
// EdataContents creates all chunks for the DLL export table.
76
class EdataContents {
77
public:
78
EdataContents(COFFLinkerContext &ctx);
79
std::vector<Chunk *> chunks;
80
81
uint64_t getRVA() { return chunks[0]->getRVA(); }
82
uint64_t getSize() {
83
return chunks.back()->getRVA() + chunks.back()->getSize() - getRVA();
84
}
85
86
COFFLinkerContext &ctx;
87
};
88
89
} // namespace lld::coff
90
91
#endif
92
93