yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
symbol_provider.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EMU_DEBUG_SYMBOL_PROVIDER_H_
2#define YAZE_APP_EMU_DEBUG_SYMBOL_PROVIDER_H_
3
4#include <cstdint>
5#include <functional>
6#include <map>
7#include <optional>
8#include <string>
9#include <vector>
10
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
13
14namespace yaze {
15namespace emu {
16namespace debug {
17
21struct Symbol {
22 std::string name; // Symbol name (e.g., "MainGameLoop", "Reset")
23 uint32_t address; // 24-bit SNES address
24 std::string file; // Source file (if known)
25 int line = 0; // Line number (if known)
26 std::string comment; // Optional comment or description
27 bool is_local = false; // True for local labels (starting with .)
28
29 Symbol() = default;
30 Symbol(const std::string& n, uint32_t addr)
31 : name(n), address(addr) {}
32 Symbol(const std::string& n, uint32_t addr, const std::string& f, int l)
33 : name(n), address(addr), file(f), line(l) {}
34};
35
39enum class SymbolFormat {
40 kAuto, // Auto-detect based on file extension/content
41 kAsar, // Asar-style .asm/.sym files (label: at address #_XXXXXX:)
42 kWlaDx, // WLA-DX .sym format (bank:address name)
43 kMesen, // Mesen .mlb format (address:name)
44 kBsnes, // bsnes .sym format (address name)
45 kNo$snes, // No$snes .sym format (bank:addr name)
46 kSourceMap, // JSON source map format (address, file, line)
47};
48
69 public:
70 SymbolProvider() = default;
71
82 absl::Status LoadAsarAsmFile(const std::string& path);
83
92 absl::Status LoadAsarAsmDirectory(const std::string& directory_path);
93
101 absl::Status LoadSymbolFile(const std::string& path,
103
107 void AddSymbol(const Symbol& symbol);
108
112 void AddAsarSymbols(const std::vector<Symbol>& symbols);
113
117 void Clear();
118
123 std::string GetSymbolName(uint32_t address) const;
124
129 std::optional<Symbol> GetSymbol(uint32_t address) const;
130
134 std::vector<Symbol> GetSymbolsAtAddress(uint32_t address) const;
135
140 std::optional<Symbol> FindSymbol(const std::string& name) const;
141
147 std::vector<Symbol> FindSymbolsMatching(const std::string& pattern) const;
148
152 std::vector<Symbol> GetSymbolsInRange(uint32_t start, uint32_t end) const;
153
159 std::optional<Symbol> GetNearestSymbol(uint32_t address) const;
160
169 std::string FormatAddress(uint32_t address,
170 uint32_t max_offset = 0x100) const;
171
175 std::string GetSourceLocation(uint32_t address) const;
176
180 size_t GetSymbolCount() const { return symbols_by_address_.size(); }
181
185 bool HasSymbols() const { return !symbols_by_address_.empty(); }
186
190 std::function<std::string(uint32_t)> CreateResolver() const;
191
198 absl::StatusOr<std::string> ExportSymbols(SymbolFormat format) const;
199
200 private:
201 // Parse different symbol file formats
202 absl::Status ParseAsarAsmContent(const std::string& content,
203 const std::string& filename);
204 absl::Status ParseWlaDxSymFile(const std::string& content);
205 absl::Status ParseMesenMlbFile(const std::string& content);
206 absl::Status ParseBsnesSymFile(const std::string& content);
207 absl::Status ParseSourceMapJson(const std::string& content);
208
209 // Detect format from file content
210 SymbolFormat DetectFormat(const std::string& content,
211 const std::string& extension) const;
212
213 // Primary storage: address -> symbols (may have multiple per address)
214 std::multimap<uint32_t, Symbol> symbols_by_address_;
215
216 // Secondary index: name -> symbol (for reverse lookup)
217 std::map<std::string, Symbol> symbols_by_name_;
218};
219
220} // namespace debug
221} // namespace emu
222} // namespace yaze
223
224#endif // YAZE_APP_EMU_DEBUG_SYMBOL_PROVIDER_H_
Provider for symbol (label) resolution in disassembly.
std::function< std::string(uint32_t)> CreateResolver() const
Create a symbol resolver function for the disassembler.
std::vector< Symbol > GetSymbolsInRange(uint32_t start, uint32_t end) const
Get all symbols in an address range.
bool HasSymbols() const
Check if any symbols are loaded.
std::string FormatAddress(uint32_t address, uint32_t max_offset=0x100) const
Format an address with symbol info.
void AddSymbol(const Symbol &symbol)
Add a single symbol manually.
std::map< std::string, Symbol > symbols_by_name_
size_t GetSymbolCount() const
Get total number of loaded symbols.
std::vector< Symbol > GetSymbolsAtAddress(uint32_t address) const
Get all symbols at an address (there may be multiple)
void AddAsarSymbols(const std::vector< Symbol > &symbols)
Add symbols from Asar patch results.
std::string GetSourceLocation(uint32_t address) const
Get source file and line for an address (for VS Code integration)
absl::Status ParseBsnesSymFile(const std::string &content)
absl::Status LoadAsarAsmDirectory(const std::string &directory_path)
Load symbols from a directory of ASM files.
absl::Status ParseWlaDxSymFile(const std::string &content)
std::multimap< uint32_t, Symbol > symbols_by_address_
absl::StatusOr< std::string > ExportSymbols(SymbolFormat format) const
Export all symbols to a string in the specified format.
absl::Status ParseSourceMapJson(const std::string &content)
absl::Status LoadAsarAsmFile(const std::string &path)
Load symbols from an Asar-style ASM file (usdasm format)
SymbolFormat DetectFormat(const std::string &content, const std::string &extension) const
absl::Status LoadSymbolFile(const std::string &path, SymbolFormat format=SymbolFormat::kAuto)
Load symbols from a .sym file (various formats)
std::string GetSymbolName(uint32_t address) const
Get symbol name for an address.
void Clear()
Clear all loaded symbols.
std::optional< Symbol > GetNearestSymbol(uint32_t address) const
Get nearest symbol at or before an address.
absl::Status ParseAsarAsmContent(const std::string &content, const std::string &filename)
absl::Status ParseMesenMlbFile(const std::string &content)
std::optional< Symbol > GetSymbol(uint32_t address) const
Get full symbol info for an address.
std::optional< Symbol > FindSymbol(const std::string &name) const
Find symbol by name.
std::vector< Symbol > FindSymbolsMatching(const std::string &pattern) const
Find symbols matching a pattern (supports wildcards)
SymbolFormat
Supported symbol file formats.
Information about a symbol (label, constant, or address)
Symbol(const std::string &n, uint32_t addr, const std::string &f, int l)
Symbol(const std::string &n, uint32_t addr)