mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
7cecb28bdf
This fixes a problem I was having where using frame advance with the debugger open would frequently cause panic alerts about invalid addresses due to the CPU thread changing MSR.DR while the host thread was trying to access memory. To aid in tracking down all the places where we weren't properly locking the CPU, I've created a new type (in Core.h) that you have to pass as a reference or pointer to functions that require running as the CPU thread.
96 lines
2.2 KiB
C++
96 lines
2.2 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 Symbol
|
|
{
|
|
enum class Type
|
|
{
|
|
Function,
|
|
Data,
|
|
};
|
|
|
|
void Rename(const std::string& symbol_name);
|
|
|
|
std::string name;
|
|
std::string function_name; // stripped function name
|
|
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 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; }
|
|
XFuncMap& AccessSymbols() { return m_functions; }
|
|
bool IsEmpty() const;
|
|
void Clear(const char* prefix = "");
|
|
void List();
|
|
void Index();
|
|
|
|
protected:
|
|
XFuncMap m_functions;
|
|
XFuncPtrMap m_checksum_to_function;
|
|
};
|
|
} // namespace Common
|