// Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. // This file contains a generic symbol map implementation. For CPU-specific // magic, derive and extend. #pragma once #include #include #include #include #include "Common/Common.h" struct SCall { SCall(u32 a, u32 b) : function(a), callAddress(b) {} u32 function; u32 callAddress; }; struct Symbol { enum { SYMBOL_FUNCTION = 0, SYMBOL_DATA = 1, }; Symbol() : hash(0), address(0), flags(0), size(0), numCalls(0), type(SYMBOL_FUNCTION), analyzed(0) {} std::string name; std::vector callers; //addresses of functions that call this function std::vector calls; //addresses of functions that are called by this function u32 hash; //use for HLE function finding u32 address; u32 flags; int size; int numCalls; int type; int index; // only used for coloring the disasm view int analyzed; }; 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: typedef std::map XFuncMap; typedef std::map XFuncPtrMap; protected: XFuncMap functions; XFuncPtrMap checksumToFunction; public: SymbolDB() {} virtual ~SymbolDB() {} virtual Symbol *GetSymbolFromAddr(u32 addr) { return nullptr; } virtual Symbol *AddFunction(u32 startAddr) { return nullptr; } void AddCompleteSymbol(const Symbol &symbol); Symbol* GetSymbolFromName(const std::string& name); Symbol* GetSymbolFromHash(u32 hash) { XFuncPtrMap::iterator iter = checksumToFunction.find(hash); if (iter != checksumToFunction.end()) return iter->second; else return nullptr; } const XFuncMap &Symbols() const { return functions; } XFuncMap &AccessSymbols() { return functions; } void Clear(const char *prefix = ""); void List(); void Index(); };