xref: /openbsd/gnu/llvm/lld/MachO/ExportTrie.h (revision dfe94b16)
1bb684c34Spatrick //===- ExportTrie.h ---------------------------------------------*- C++ -*-===//
2bb684c34Spatrick //
3bb684c34Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bb684c34Spatrick // See https://llvm.org/LICENSE.txt for license information.
5bb684c34Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bb684c34Spatrick //
7bb684c34Spatrick //===----------------------------------------------------------------------===//
8bb684c34Spatrick 
9bb684c34Spatrick #ifndef LLD_MACHO_EXPORT_TRIE_H
10bb684c34Spatrick #define LLD_MACHO_EXPORT_TRIE_H
11bb684c34Spatrick 
12bb684c34Spatrick #include "llvm/ADT/ArrayRef.h"
13bb684c34Spatrick #include "llvm/ADT/STLExtras.h"
14bb684c34Spatrick 
15bb684c34Spatrick #include <vector>
16bb684c34Spatrick 
17*dfe94b16Srobert namespace lld::macho {
18bb684c34Spatrick 
19bb684c34Spatrick struct TrieNode;
20bb684c34Spatrick class Symbol;
21bb684c34Spatrick 
22bb684c34Spatrick class TrieBuilder {
23bb684c34Spatrick public:
24*dfe94b16Srobert   ~TrieBuilder();
setImageBase(uint64_t addr)251cf9926bSpatrick   void setImageBase(uint64_t addr) { imageBase = addr; }
addSymbol(const Symbol & sym)26bb684c34Spatrick   void addSymbol(const Symbol &sym) { exported.push_back(&sym); }
27bb684c34Spatrick   // Returns the size in bytes of the serialized trie.
28bb684c34Spatrick   size_t build();
29bb684c34Spatrick   void writeTo(uint8_t *buf) const;
30bb684c34Spatrick 
31bb684c34Spatrick private:
32bb684c34Spatrick   TrieNode *makeNode();
33bb684c34Spatrick   void sortAndBuild(llvm::MutableArrayRef<const Symbol *> vec, TrieNode *node,
34bb684c34Spatrick                     size_t lastPos, size_t pos);
35bb684c34Spatrick 
361cf9926bSpatrick   uint64_t imageBase = 0;
37bb684c34Spatrick   std::vector<const Symbol *> exported;
38bb684c34Spatrick   std::vector<TrieNode *> nodes;
39bb684c34Spatrick };
40bb684c34Spatrick 
41bb684c34Spatrick using TrieEntryCallback =
42bb684c34Spatrick     llvm::function_ref<void(const llvm::Twine & /*name*/, uint64_t /*flags*/)>;
43bb684c34Spatrick 
44bb684c34Spatrick void parseTrie(const uint8_t *buf, size_t size, const TrieEntryCallback &);
45bb684c34Spatrick 
46*dfe94b16Srobert } // namespace lld::macho
47bb684c34Spatrick 
48bb684c34Spatrick #endif
49