diff options
Diffstat (limited to 'view/sharedcache/workflow/SharedCacheWorkflow.cpp')
| -rw-r--r-- | view/sharedcache/workflow/SharedCacheWorkflow.cpp | 56 |
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 §Func : bv->GetAnalysisFunctionList()) + { + if (section->GetStart() <= sectFunc->GetStart() && sectFunc->GetStart() < section->GetEnd()) { - if (section->GetStart() <= sectFunc->GetStart() - && sectFunc->GetStart() < section->GetEnd()) - { - func->Reanalyze(); - } + func->Reanalyze(); } } } |
