SymbolDB.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2009 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "Common/SymbolDB.h"
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <utility>
  8. #include "Common/CommonTypes.h"
  9. #include "Common/Logging/Log.h"
  10. namespace Common
  11. {
  12. static std::string GetStrippedFunctionName(const std::string& symbol_name)
  13. {
  14. std::string name = symbol_name.substr(0, symbol_name.find('('));
  15. size_t position = name.find(' ');
  16. if (position != std::string::npos)
  17. name.erase(position);
  18. return name;
  19. }
  20. SymbolDB::SymbolDB() = default;
  21. SymbolDB::~SymbolDB() = default;
  22. void Symbol::Rename(const std::string& symbol_name)
  23. {
  24. this->name = symbol_name;
  25. this->function_name = GetStrippedFunctionName(symbol_name);
  26. }
  27. void SymbolDB::List()
  28. {
  29. for (const auto& func : m_functions)
  30. {
  31. DEBUG_LOG_FMT(OSHLE, "{} @ {:08x}: {} bytes (hash {:08x}) : {} calls", func.second.name,
  32. func.second.address, func.second.size, func.second.hash, func.second.num_calls);
  33. }
  34. INFO_LOG_FMT(OSHLE, "{} functions known in this program above.", m_functions.size());
  35. }
  36. bool SymbolDB::IsEmpty() const
  37. {
  38. return m_functions.empty();
  39. }
  40. void SymbolDB::Clear(const char* prefix)
  41. {
  42. // TODO: honor prefix
  43. m_functions.clear();
  44. m_checksum_to_function.clear();
  45. }
  46. void SymbolDB::Index()
  47. {
  48. int i = 0;
  49. for (auto& func : m_functions)
  50. {
  51. func.second.index = i++;
  52. }
  53. }
  54. Symbol* SymbolDB::GetSymbolFromName(std::string_view name)
  55. {
  56. for (auto& func : m_functions)
  57. {
  58. if (func.second.function_name == name)
  59. return &func.second;
  60. }
  61. return nullptr;
  62. }
  63. std::vector<Symbol*> SymbolDB::GetSymbolsFromName(std::string_view name)
  64. {
  65. std::vector<Symbol*> symbols;
  66. for (auto& func : m_functions)
  67. {
  68. if (func.second.function_name == name)
  69. symbols.push_back(&func.second);
  70. }
  71. return symbols;
  72. }
  73. Symbol* SymbolDB::GetSymbolFromHash(u32 hash)
  74. {
  75. auto iter = m_checksum_to_function.find(hash);
  76. if (iter == m_checksum_to_function.end())
  77. return nullptr;
  78. return *iter->second.begin();
  79. }
  80. std::vector<Symbol*> SymbolDB::GetSymbolsFromHash(u32 hash)
  81. {
  82. const auto iter = m_checksum_to_function.find(hash);
  83. if (iter == m_checksum_to_function.cend())
  84. return {};
  85. return {iter->second.cbegin(), iter->second.cend()};
  86. }
  87. void SymbolDB::AddCompleteSymbol(const Symbol& symbol)
  88. {
  89. m_functions.emplace(symbol.address, symbol);
  90. }
  91. } // namespace Common