1 //===- DLL.h ----------------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
10 #define LLD_COFF_DLL_H
19 // IdataContents creates all chunks for the DLL import table.
20 // You are supposed to call add() to add symbols and then
21 // call create() to populate the chunk vectors.
24 void add(DefinedImportData *sym) { imports.push_back(sym); }
25 bool empty() { return imports.empty(); }
29 std::vector<DefinedImportData *> imports;
30 std::vector<Chunk *> dirs;
31 std::vector<Chunk *> lookups;
32 std::vector<Chunk *> addresses;
33 std::vector<Chunk *> hints;
34 std::vector<Chunk *> dllNames;
38 // DelayLoadContents creates all chunks for the delay-load DLL import table.
39 class DelayLoadContents {
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; }
48 uint64_t getDirRVA() { return dirs[0]->getRVA(); }
49 uint64_t getDirSize();
52 Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
53 Chunk *newTailMergeChunk(Chunk *dir);
56 std::vector<DefinedImportData *> imports;
57 std::vector<Chunk *> dirs;
58 std::vector<Chunk *> moduleHandles;
59 std::vector<Chunk *> addresses;
60 std::vector<Chunk *> names;
61 std::vector<Chunk *> hintNames;
62 std::vector<Chunk *> thunks;
63 std::vector<Chunk *> dllNames;
67 // EdataContents creates all chunks for the DLL export table.
71 std::vector<Chunk *> chunks;
73 uint64_t getRVA() { return chunks[0]->getRVA(); }
75 return chunks.back()->getRVA() + chunks.back()->getSize() - getRVA();