xref: /freebsd/contrib/llvm-project/lld/COFF/DLL.h (revision 2008043f386721d58158e37e0d7e50df8095942d)
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