xref: /freebsd/contrib/llvm-project/lld/COFF/DLL.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===- DLL.h ----------------------------------------------------*- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #ifndef LLD_COFF_DLL_H
10*0b57cec5SDimitry Andric #define LLD_COFF_DLL_H
11*0b57cec5SDimitry Andric 
12*0b57cec5SDimitry Andric #include "Chunks.h"
13*0b57cec5SDimitry Andric #include "Symbols.h"
14*0b57cec5SDimitry Andric 
15*0b57cec5SDimitry Andric namespace lld {
16*0b57cec5SDimitry Andric namespace coff {
17*0b57cec5SDimitry Andric 
18*0b57cec5SDimitry Andric // Windows-specific.
19*0b57cec5SDimitry Andric // IdataContents creates all chunks for the DLL import table.
20*0b57cec5SDimitry Andric // You are supposed to call add() to add symbols and then
21*0b57cec5SDimitry Andric // call create() to populate the chunk vectors.
22*0b57cec5SDimitry Andric class IdataContents {
23*0b57cec5SDimitry Andric public:
24*0b57cec5SDimitry Andric   void add(DefinedImportData *sym) { imports.push_back(sym); }
25*0b57cec5SDimitry Andric   bool empty() { return imports.empty(); }
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric   void create();
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric   std::vector<DefinedImportData *> imports;
30*0b57cec5SDimitry Andric   std::vector<Chunk *> dirs;
31*0b57cec5SDimitry Andric   std::vector<Chunk *> lookups;
32*0b57cec5SDimitry Andric   std::vector<Chunk *> addresses;
33*0b57cec5SDimitry Andric   std::vector<Chunk *> hints;
34*0b57cec5SDimitry Andric   std::vector<Chunk *> dllNames;
35*0b57cec5SDimitry Andric };
36*0b57cec5SDimitry Andric 
37*0b57cec5SDimitry Andric // Windows-specific.
38*0b57cec5SDimitry Andric // DelayLoadContents creates all chunks for the delay-load DLL import table.
39*0b57cec5SDimitry Andric class DelayLoadContents {
40*0b57cec5SDimitry Andric public:
41*0b57cec5SDimitry Andric   void add(DefinedImportData *sym) { imports.push_back(sym); }
42*0b57cec5SDimitry Andric   bool empty() { return imports.empty(); }
43*0b57cec5SDimitry Andric   void create(Defined *helper);
44*0b57cec5SDimitry Andric   std::vector<Chunk *> getChunks();
45*0b57cec5SDimitry Andric   std::vector<Chunk *> getDataChunks();
46*0b57cec5SDimitry Andric   ArrayRef<Chunk *> getCodeChunks() { return thunks; }
47*0b57cec5SDimitry Andric 
48*0b57cec5SDimitry Andric   uint64_t getDirRVA() { return dirs[0]->getRVA(); }
49*0b57cec5SDimitry Andric   uint64_t getDirSize();
50*0b57cec5SDimitry Andric 
51*0b57cec5SDimitry Andric private:
52*0b57cec5SDimitry Andric   Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
53*0b57cec5SDimitry Andric   Chunk *newTailMergeChunk(Chunk *dir);
54*0b57cec5SDimitry Andric 
55*0b57cec5SDimitry Andric   Defined *helper;
56*0b57cec5SDimitry Andric   std::vector<DefinedImportData *> imports;
57*0b57cec5SDimitry Andric   std::vector<Chunk *> dirs;
58*0b57cec5SDimitry Andric   std::vector<Chunk *> moduleHandles;
59*0b57cec5SDimitry Andric   std::vector<Chunk *> addresses;
60*0b57cec5SDimitry Andric   std::vector<Chunk *> names;
61*0b57cec5SDimitry Andric   std::vector<Chunk *> hintNames;
62*0b57cec5SDimitry Andric   std::vector<Chunk *> thunks;
63*0b57cec5SDimitry Andric   std::vector<Chunk *> dllNames;
64*0b57cec5SDimitry Andric };
65*0b57cec5SDimitry Andric 
66*0b57cec5SDimitry Andric // Windows-specific.
67*0b57cec5SDimitry Andric // EdataContents creates all chunks for the DLL export table.
68*0b57cec5SDimitry Andric class EdataContents {
69*0b57cec5SDimitry Andric public:
70*0b57cec5SDimitry Andric   EdataContents();
71*0b57cec5SDimitry Andric   std::vector<Chunk *> chunks;
72*0b57cec5SDimitry Andric 
73*0b57cec5SDimitry Andric   uint64_t getRVA() { return chunks[0]->getRVA(); }
74*0b57cec5SDimitry Andric   uint64_t getSize() {
75*0b57cec5SDimitry Andric     return chunks.back()->getRVA() + chunks.back()->getSize() - getRVA();
76*0b57cec5SDimitry Andric   }
77*0b57cec5SDimitry Andric };
78*0b57cec5SDimitry Andric 
79*0b57cec5SDimitry Andric } // namespace coff
80*0b57cec5SDimitry Andric } // namespace lld
81*0b57cec5SDimitry Andric 
82*0b57cec5SDimitry Andric #endif
83