summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorMarkus Wick <degasus@users.noreply.github.com>2017-09-10 11:48:33 +0200
committerGitHub <noreply@github.com>2017-09-10 11:48:33 +0200
commitc8f3e175cebc6f49ba600b1232ac33bf682bb3d6 (patch)
treefde4a5be9d87aec65c4d8ccbae4f5da5bfe9f255 /Source
parent432117047b9c4693ad74b78d5a7d21aedd10f455 (diff)
parentcc40931d6422506a36cb6838372dae1e8b5f3de4 (diff)
Merge pull request #6037 from leoetlino/symbols
JIT: Don't always look up symbols for blocks
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Common/JitRegister.cpp11
-rw-r--r--Source/Core/Common/JitRegister.h1
-rw-r--r--Source/Core/Core/PowerPC/JitCommon/JitCache.cpp8
-rw-r--r--Source/Core/Core/PowerPC/PPCSymbolDB.cpp25
4 files changed, 32 insertions, 13 deletions
diff --git a/Source/Core/Common/JitRegister.cpp b/Source/Core/Common/JitRegister.cpp
index 61d7e05685..08b93e39da 100644
--- a/Source/Core/Common/JitRegister.cpp
+++ b/Source/Core/Common/JitRegister.cpp
@@ -37,10 +37,13 @@ static File::IOFile s_perf_map_file;
namespace JitRegister
{
+static bool s_is_enabled = false;
+
void Init(const std::string& perf_dir)
{
#if defined USE_OPROFILE && USE_OPROFILE
s_agent = op_open_agent();
+ s_is_enabled = true;
#endif
if (!perf_dir.empty() || getenv("PERF_BUILDID_DIR"))
@@ -51,6 +54,7 @@ void Init(const std::string& perf_dir)
// Disable buffering in order to avoid missing some mappings
// if the event of a crash:
std::setvbuf(s_perf_map_file.GetHandle(), nullptr, _IONBF, 0);
+ s_is_enabled = true;
}
}
@@ -67,6 +71,13 @@ void Shutdown()
if (s_perf_map_file.IsOpen())
s_perf_map_file.Close();
+
+ s_is_enabled = false;
+}
+
+bool IsEnabled()
+{
+ return s_is_enabled;
}
void RegisterV(const void* base_address, u32 code_size, const char* format, va_list args)
diff --git a/Source/Core/Common/JitRegister.h b/Source/Core/Common/JitRegister.h
index f4068bc282..3d142ec530 100644
--- a/Source/Core/Common/JitRegister.h
+++ b/Source/Core/Common/JitRegister.h
@@ -12,6 +12,7 @@ namespace JitRegister
void Init(const std::string& perf_dir);
void Shutdown();
void RegisterV(const void* base_address, u32 code_size, const char* format, va_list args);
+bool IsEnabled();
inline void Register(const void* base_address, u32 code_size, const char* format, ...)
{
diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp
index b70e7a103b..8026e5c78f 100644
--- a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp
+++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp
@@ -132,12 +132,18 @@ void JitBaseBlockCache::FinalizeBlock(JitBlock& block, bool block_link,
LinkBlock(block);
}
- if (Symbol* symbol = g_symbolDB.GetSymbolFromAddr(block.effectiveAddress))
+ Symbol* symbol = nullptr;
+ if (JitRegister::IsEnabled() &&
+ (symbol = g_symbolDB.GetSymbolFromAddr(block.effectiveAddress)) != nullptr)
+ {
JitRegister::Register(block.checkedEntry, block.codeSize, "JIT_PPC_%s_%08x",
symbol->function_name.c_str(), block.physicalAddress);
+ }
else
+ {
JitRegister::Register(block.checkedEntry, block.codeSize, "JIT_PPC_%08x",
block.physicalAddress);
+ }
}
JitBlock* JitBaseBlockCache::GetBlockFromStartAddress(u32 addr, u32 msr)
diff --git a/Source/Core/Core/PowerPC/PPCSymbolDB.cpp b/Source/Core/Core/PowerPC/PPCSymbolDB.cpp
index b4aaa6145a..f9ce0508a3 100644
--- a/Source/Core/Core/PowerPC/PPCSymbolDB.cpp
+++ b/Source/Core/Core/PowerPC/PPCSymbolDB.cpp
@@ -79,19 +79,20 @@ void PPCSymbolDB::AddKnownSymbol(u32 startAddr, u32 size, const std::string& nam
Symbol* PPCSymbolDB::GetSymbolFromAddr(u32 addr)
{
- XFuncMap::iterator it = functions.find(addr);
- if (it != functions.end())
- {
+ XFuncMap::iterator it = functions.lower_bound(addr);
+ if (it == functions.end())
+ return nullptr;
+
+ // If the address is exactly the start address of a symbol, we're done.
+ if (it->second.address == addr)
return &it->second;
- }
- else
- {
- for (auto& p : functions)
- {
- if (addr >= p.second.address && addr < p.second.address + p.second.size)
- return &p.second;
- }
- }
+
+ // Otherwise, check whether the address is within the bounds of a symbol.
+ if (it != functions.begin())
+ --it;
+ if (addr >= it->second.address && addr < it->second.address + it->second.size)
+ return &it->second;
+
return nullptr;
}