summaryrefslogtreecommitdiff
path: root/view/sharedcache/workflow/SharedCacheWorkflow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'view/sharedcache/workflow/SharedCacheWorkflow.cpp')
-rw-r--r--view/sharedcache/workflow/SharedCacheWorkflow.cpp56
1 files changed, 36 insertions, 20 deletions
diff --git a/view/sharedcache/workflow/SharedCacheWorkflow.cpp b/view/sharedcache/workflow/SharedCacheWorkflow.cpp
index 4b4e464e..88353bf7 100644
--- a/view/sharedcache/workflow/SharedCacheWorkflow.cpp
+++ b/view/sharedcache/workflow/SharedCacheWorkflow.cpp
@@ -120,10 +120,6 @@ void SharedCacheWorkflow::FixupStubs(Ref<AnalysisContext> ctx)
const auto bv = func->GetView();
auto workflowState = GetGlobalWorkflowState(bv);
- Ref<SharedCacheAPI::SharedCache> cache = new SharedCacheAPI::SharedCache(bv);
-
- if (!cache)
- return;
auto funcStart = func->GetStart();
auto sectionExists = !bv->GetSectionsAt(funcStart).empty();
@@ -202,6 +198,14 @@ void SharedCacheWorkflow::FixupStubs(Ref<AnalysisContext> ctx)
auto def = mssa->GetSSAVarDefinition(dest.GetSourceSSAVariable());
auto defInstr = mssa->GetInstruction(def);
auto targetOffset = defInstr.GetSourceExpr().GetSourceExpr().GetConstant();
+
+ if (bv->IsValidOffset(targetOffset))
+ return;
+
+ Ref<SharedCacheAPI::SharedCache> cache = new SharedCacheAPI::SharedCache(bv);
+
+ if (!cache)
+ return;
if (!cache->GetImageNameForAddress(targetOffset).empty())
{
cache->LoadImageContainingAddress(targetOffset);
@@ -236,6 +240,14 @@ void SharedCacheWorkflow::FixupStubs(Ref<AnalysisContext> ctx)
std::unique_lock<std::mutex> lock(workflowState->imageLoadMutex);
auto dest = instr.GetDestExpr<MLIL_JUMP>();
auto targetOffset = dest.GetConstant();
+ if (bv->IsValidOffset(targetOffset))
+ return;
+
+ Ref<SharedCacheAPI::SharedCache> cache = new SharedCacheAPI::SharedCache(bv);
+
+ if (!cache)
+ return;
+
if (!cache->GetImageNameForAddress(targetOffset).empty())
{
cache->LoadImageContainingAddress(targetOffset);
@@ -338,24 +350,28 @@ void SharedCacheWorkflow::FixupStubs(Ref<AnalysisContext> ctx)
auto def = mssa->GetSSAVarDefinition(dest.GetSourceSSAVariable());
auto defInstr = mssa->GetInstruction(def);
auto targetOffset = defInstr.GetSourceExpr().GetSourceExpr().GetConstant();
- auto sharedCache = SharedCacheAPI::SharedCache(bv);
- if (!bv->IsValidOffset(targetOffset))
+
+ if (bv->IsValidOffset(targetOffset))
+ return;
+
+ Ref<SharedCacheAPI::SharedCache> cache = new SharedCacheAPI::SharedCache(bv);
+
+ if (!cache)
+ return;
+
+ if (!cache->GetImageNameForAddress(targetOffset).empty())
{
- if (!sharedCache.GetImageNameForAddress(targetOffset).empty())
- {
- sharedCache.LoadImageContainingAddress(targetOffset);
- }
- else
- {
- sharedCache.LoadSectionAtAddress(targetOffset);
- }
- for (const auto& sectFunc : bv->GetAnalysisFunctionList())
+ cache->LoadImageContainingAddress(targetOffset);
+ }
+ else
+ {
+ cache->LoadSectionAtAddress(targetOffset);
+ }
+ for (const auto &sectFunc : bv->GetAnalysisFunctionList())
+ {
+ if (section->GetStart() <= sectFunc->GetStart() && sectFunc->GetStart() < section->GetEnd())
{
- if (section->GetStart() <= sectFunc->GetStart()
- && sectFunc->GetStart() < section->GetEnd())
- {
- func->Reanalyze();
- }
+ func->Reanalyze();
}
}
}