Files
dolphin/Source/Core/Common/SymbolDB.h
TryTwo 040d9a4336 Debugger symbols: Add new symbol type: Notes.. Notes are for naming single instructions, or small groups of instructions.
Notes are separate from function symbols, and can be searched separately.
Unlike functions, notes of different length can overlap each other.
In the instruction window, a note will always display over the function symbol.
2025-06-19 17:55:35 -07:00

113 lines
2.6 KiB
C++

// Copyright 2008 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
// This file contains a generic symbol map implementation. For CPU-specific
// magic, derive and extend.
#pragma once
#include <map>
#include <set>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
#include "Common/CommonTypes.h"
namespace Core
{
class CPUThreadGuard;
}
namespace Common
{
struct SCall
{
SCall(u32 a, u32 b) : function(a), call_address(b) {}
u32 function;
u32 call_address;
};
struct Note
{
std::string name;
u32 address = 0;
u32 size = 0;
int layer = 0;
Note() = default;
};
struct Symbol
{
enum class Type
{
Function,
Data,
};
Symbol() = default;
explicit Symbol(const std::string& symbol_name) { Rename(symbol_name); }
void Rename(const std::string& symbol_name);
std::string name;
std::string function_name; // stripped function name
std::string object_name; // name of object/source file symbol belongs to
std::vector<SCall> callers; // addresses of functions that call this function
std::vector<SCall> calls; // addresses of functions that are called by this function
u32 hash = 0; // use for HLE function finding
u32 address = 0;
u32 flags = 0;
u32 size = 0;
int num_calls = 0;
Type type = Type::Function;
int index = 0; // only used for coloring the disasm view
bool analyzed = false;
};
enum
{
FFLAG_TIMERINSTRUCTIONS = (1 << 0),
FFLAG_LEAF = (1 << 1),
FFLAG_ONLYCALLSNICELEAFS = (1 << 2),
FFLAG_EVIL = (1 << 3),
FFLAG_RFI = (1 << 4),
FFLAG_STRAIGHT = (1 << 5)
};
class SymbolDB
{
public:
using XFuncMap = std::map<u32, Symbol>;
using XNoteMap = std::map<u32, Note>;
using XFuncPtrMap = std::map<u32, std::set<Symbol*>>;
SymbolDB();
virtual ~SymbolDB();
virtual Symbol* GetSymbolFromAddr(u32 addr) { return nullptr; }
virtual Symbol* AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr) { return nullptr; }
void AddCompleteSymbol(const Symbol& symbol);
Symbol* GetSymbolFromName(std::string_view name);
std::vector<Symbol*> GetSymbolsFromName(std::string_view name);
Symbol* GetSymbolFromHash(u32 hash);
std::vector<Symbol*> GetSymbolsFromHash(u32 hash);
const XFuncMap& Symbols() const { return m_functions; }
const XNoteMap& Notes() const { return m_notes; }
XFuncMap& AccessSymbols() { return m_functions; }
bool IsEmpty() const;
void Clear(const char* prefix = "");
void List();
void Index();
protected:
XFuncMap m_functions;
XNoteMap m_notes;
XFuncPtrMap m_checksum_to_function;
};
} // namespace Common