/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2013 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #ifndef XENIA_CPU_SDB_SYMBOL_H_ #define XENIA_CPU_SDB_SYMBOL_H_ #include #include #include #include namespace xe { namespace cpu { namespace sdb { class FunctionSymbol; class VariableSymbol; class FunctionCall { public: uint32_t address; FunctionSymbol* source; FunctionSymbol* target; }; class VariableAccess { public: uint32_t address; FunctionSymbol* source; VariableSymbol* target; }; class Symbol { public: enum SymbolType { Function = 0, Variable = 1, ExceptionEntry = 2, }; virtual ~Symbol(); SymbolType symbol_type; const char* name(); void set_name(const char* value); protected: Symbol(SymbolType type); char* name_; }; class ExceptionEntrySymbol; class FunctionBlock { public: enum TargetType { kTargetUnknown = 0, kTargetBlock = 1, kTargetFunction = 2, kTargetLR = 3, kTargetCTR = 4, kTargetNone = 5, }; FunctionBlock(); uint32_t start_address; uint32_t end_address; std::vector incoming_blocks; TargetType outgoing_type; uint32_t outgoing_address; union { FunctionSymbol* outgoing_function; FunctionBlock* outgoing_block; }; }; class FunctionSymbol : public Symbol { public: enum FunctionType { Unknown = 0, Kernel = 1, User = 2, }; enum Flags { kFlagSaveGprLr = 1 << 1, kFlagRestGprLr = 1 << 2, }; FunctionSymbol(); virtual ~FunctionSymbol(); FunctionBlock* GetBlock(uint32_t address); FunctionBlock* SplitBlock(uint32_t address); uint32_t start_address; uint32_t end_address; FunctionType type; uint32_t flags; kernel::KernelExport* kernel_export; ExceptionEntrySymbol* ee; std::vector incoming_calls; std::vector outgoing_calls; std::vector variable_accesses; std::map blocks; }; class VariableSymbol : public Symbol { public: VariableSymbol(); virtual ~VariableSymbol(); uint32_t address; kernel::KernelExport* kernel_export; }; class ExceptionEntrySymbol : public Symbol { public: ExceptionEntrySymbol(); virtual ~ExceptionEntrySymbol() {} uint32_t address; FunctionSymbol* function; }; } // namespace sdb } // namespace cpu } // namespace xe #endif // XENIA_CPU_SDB_SYMBOL_H_