Theodosius v3.0
Jit linker, symbol mapper, and obfuscator
symbol_table.cpp
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
32
33namespace theo::recomp {
34symbol_table_t::symbol_table_t(const std::vector<decomp::symbol_t>&& syms) {
35 std::for_each(syms.begin(), syms.end(), [&](decomp::symbol_t sym) {
36 m_table.insert({sym.hash(), sym});
37 });
38}
39
40void symbol_table_t::put_symbol(decomp::symbol_t& sym) {
41 m_table.insert({sym.hash(), sym});
42}
43
44void symbol_table_t::put_symbols(std::vector<decomp::symbol_t>& syms) {
45 std::for_each(syms.begin(), syms.end(),
46 [&](decomp::symbol_t sym) { put_symbol(sym); });
47}
48
49void symbol_table_t::for_each(std::function<void(decomp::symbol_t& sym)> fn) {
50 for (auto itr = m_table.begin(); itr != m_table.end(); ++itr)
51 fn(itr->second);
52}
53
54std::optional<decomp::symbol_t*> symbol_table_t::sym_from_hash(
55 std::size_t hash) {
56 return m_table.count(hash) ? &m_table.at(hash)
57 : std::optional<decomp::symbol_t*>{};
58}
59
60std::optional<decomp::symbol_t*> symbol_table_t::sym_from_alloc(
61 std::uintptr_t allocated_at) {
62 auto res =
63 std::find_if(m_table.begin(), m_table.end(),
64 [&](std::pair<const std::size_t, decomp::symbol_t> itr) {
65 return itr.second.allocated_at() == allocated_at;
66 });
67
68 return res != m_table.end() ? &res->second
69 : std::optional<decomp::symbol_t*>{};
70}
71
72std::uint32_t symbol_table_t::size() {
73 return m_table.size();
74}
75} // namespace theo::recomp