xref: /llvm-project/lld/COFF/DLL.h (revision 97aa56ada5d25803112901ff06764975506ce7a6)
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   std::vector<Chunk *> auxIat;
35   std::vector<Chunk *> auxIatCopy;
36 };
37 
38 // Windows-specific.
39 // DelayLoadContents creates all chunks for the delay-load DLL import table.
40 class DelayLoadContents {
41 public:
42   DelayLoadContents(COFFLinkerContext &ctx) : ctx(ctx) {}
43   void add(DefinedImportData *sym) { imports.push_back(sym); }
44   bool empty() { return imports.empty(); }
45   void create();
46   std::vector<Chunk *> getChunks();
47   std::vector<Chunk *> getDataChunks();
48   ArrayRef<Chunk *> getCodeChunks() { return thunks; }
49   ArrayRef<Chunk *> getCodePData() { return pdata; }
50   ArrayRef<Chunk *> getCodeUnwindInfo() { return unwindinfo; }
51   ArrayRef<Chunk *> getAuxIat() { return auxIat; }
52   ArrayRef<Chunk *> getAuxIatCopy() { return auxIatCopy; }
53 
54   uint64_t getDirRVA() { return dirs[0]->getRVA(); }
55   uint64_t getDirSize();
56 
57 private:
58   Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
59   Chunk *newTailMergeChunk(SymbolTable &symtab, Chunk *dir);
60   Chunk *newTailMergePDataChunk(SymbolTable &symtab, Chunk *tm);
61 
62   std::vector<DefinedImportData *> imports;
63   std::vector<Chunk *> dirs;
64   std::vector<Chunk *> moduleHandles;
65   std::vector<Chunk *> addresses;
66   std::vector<Chunk *> names;
67   std::vector<Chunk *> hintNames;
68   std::vector<Chunk *> thunks;
69   std::vector<Chunk *> pdata;
70   std::vector<Chunk *> unwindinfo;
71   std::vector<Chunk *> dllNames;
72   std::vector<Chunk *> auxIat;
73   std::vector<Chunk *> auxIatCopy;
74 
75   COFFLinkerContext &ctx;
76 };
77 
78 // Create all chunks for the DLL export table.
79 void createEdataChunks(SymbolTable &symtab, std::vector<Chunk *> &chunks);
80 
81 } // namespace lld::coff
82 
83 #endif
84