| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2009 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 04:11:52 +01:00
										 |  |  | #include <cstring>
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-09-18 23:17:41 -05:00
										 |  |  | #include "Common/Logging/Log.h"
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #include "Common/SymbolDB.h"
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 02:40:24 +01:00
										 |  |  | static std::string GetStrippedFunctionName(const std::string& symbol_name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   std::string name = symbol_name.substr(0, symbol_name.find('(')); | 
					
						
							|  |  |  |   size_t position = name.find(' '); | 
					
						
							|  |  |  |   if (position != std::string::npos) | 
					
						
							|  |  |  |     name.erase(position); | 
					
						
							|  |  |  |   return name; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Symbol::Rename(const std::string& symbol_name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   this->name = symbol_name; | 
					
						
							|  |  |  |   this->function_name = GetStrippedFunctionName(symbol_name); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | void SymbolDB::List() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   for (const auto& func : functions) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     DEBUG_LOG(OSHLE, "%s @ %08x: %i bytes (hash %08x) : %i calls", func.second.name.c_str(), | 
					
						
							|  |  |  |               func.second.address, func.second.size, func.second.hash, func.second.numCalls); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   INFO_LOG(OSHLE, "%zu functions known in this program above.", functions.size()); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-21 20:46:25 +01:00
										 |  |  | void SymbolDB::Clear(const char* prefix) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // TODO: honor prefix
 | 
					
						
							|  |  |  |   functions.clear(); | 
					
						
							|  |  |  |   checksumToFunction.clear(); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SymbolDB::Index() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   int i = 0; | 
					
						
							|  |  |  |   for (auto& func : functions) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     func.second.index = i++; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | Symbol* SymbolDB::GetSymbolFromName(const std::string& name) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   for (auto& func : functions) | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2016-09-26 15:41:57 +02:00
										 |  |  |     if (func.second.function_name == name) | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |       return &func.second; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return nullptr; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-04 17:33:25 +01:00
										 |  |  | std::vector<Symbol*> SymbolDB::GetSymbolsFromName(const std::string& name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   std::vector<Symbol*> symbols; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (auto& func : functions) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (func.second.function_name == name) | 
					
						
							|  |  |  |       symbols.push_back(&func.second); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return symbols; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-05 15:51:12 +01:00
										 |  |  | Symbol* SymbolDB::GetSymbolFromHash(u32 hash) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   XFuncPtrMap::iterator iter = checksumToFunction.find(hash); | 
					
						
							|  |  |  |   if (iter != checksumToFunction.end()) | 
					
						
							| 
									
										
										
										
											2016-10-10 23:35:33 +01:00
										 |  |  |     return *iter->second.begin(); | 
					
						
							| 
									
										
										
										
											2016-10-05 15:51:12 +01:00
										 |  |  |   else | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::vector<Symbol*> SymbolDB::GetSymbolsFromHash(u32 hash) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-02-18 05:26:49 -05:00
										 |  |  |   const auto iter = checksumToFunction.find(hash); | 
					
						
							| 
									
										
										
										
											2016-10-05 15:51:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-18 05:26:49 -05:00
										 |  |  |   if (iter == checksumToFunction.cend()) | 
					
						
							|  |  |  |     return {}; | 
					
						
							| 
									
										
										
										
											2016-10-05 15:51:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-18 05:26:49 -05:00
										 |  |  |   return {iter->second.cbegin(), iter->second.cend()}; | 
					
						
							| 
									
										
										
										
											2016-10-05 15:51:12 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | void SymbolDB::AddCompleteSymbol(const Symbol& symbol) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   functions.emplace(symbol.address, symbol); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } |