Theodosius v3.0
Jit linker, symbol mapper, and obfuscator
symbol_table.hpp
Go to the documentation of this file.
1// Copyright (c) 2022, _xeroxz
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7// 1. Redistributions of source code must retain the above copyright notice,
8// this list of conditions and the following disclaimer.
9//
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13//
14// 3. Neither the name of the copyright holder nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28// POSSIBILITY OF SUCH DAMAGE.
29//
30
31#pragma once
32#include <algorithm>
33#include <functional>
34#include <map>
35#include <optional>
36#include <vector>
37
38#include <decomp/symbol.hpp>
39
40namespace theo::recomp {
41/// <summary>
42/// this class is a high level wrapper for a hashmap that contains
43/// decomp::symbol_t values. the symbol values are references by a hashcode.
44/// </summary>
46 public:
47 /// <summary>
48 /// default constructor. does nothing.
49 /// </summary>
51
52 /// <summary>
53 /// this constructor will populate the m_table private field with symbols.
54 /// </summary>
55 /// <param name="syms">vector of decomp::symbol_t</param>
56 symbol_table_t(const std::vector<decomp::symbol_t>&& syms);
57
58 /// <summary>
59 /// add symbol to m_table
60 /// </summary>
61 /// <param name="sym">symbol to be added.</param>
63
64 /// <summary>
65 /// add a vector of symbol to m_table
66 /// </summary>
67 /// <param name="syms"></param>
68 void put_symbols(std::vector<decomp::symbol_t>& syms);
69
70 /// <summary>
71 /// returns an optional pointer to a symbol from the symbol table given the
72 /// symbols hash (hash of its name) the hash is produced by
73 /// theo::decomp::symbol_t::hash
74 /// </summary>
75 /// <param name="hash">hashcode of the symbol to get from the symbol
76 /// table...</param> <returns>returns an optional pointer to a
77 /// theo::decomp::symbol_t</returns>
78 std::optional<decomp::symbol_t*> sym_from_hash(std::size_t hash);
79
80 /// <summary>
81 /// returns an optional pointer to a symbol given its allocation location.
82 /// </summary>
83 /// <param name="allocated_at">the address where the symbol is allocated
84 /// at.</param> <returns>returns an optional pointer to a
85 /// theo::decomp::symbol_t</returns>
86 std::optional<decomp::symbol_t*> sym_from_alloc(std::uintptr_t allocated_at);
87
88 /// <summary>
89 /// this function is a wrapper function that allows you to get at each entry
90 /// in the symbol table by reference.
91 /// </summary>
92 /// <param name="fn">a callback function that will be called for each
93 /// symbol</param>
94 void for_each(std::function<void(decomp::symbol_t& sym)> fn);
95
96 /// <summary>
97 /// returns the size of the symbol table.
98 /// </summary>
99 /// <returns>returns the size of the symbol table.</returns>
100 std::uint32_t size();
101
102 private:
103 std::map<std::size_t, decomp::symbol_t> m_table;
104};
105} // namespace theo::recomp