| 6709 | } |
| 6710 | |
| 6711 | void DbgModule::FinishHotSwap() |
| 6712 | { |
| 6713 | BF_ASSERT(IsObjectFile()); |
| 6714 | |
| 6715 | auto linkedModule = GetLinkedModule(); |
| 6716 | auto mainModule = mDebugTarget->mTargetBinary; |
| 6717 | |
| 6718 | HashSet<String> failSet; |
| 6719 | |
| 6720 | String findName; |
| 6721 | for (auto deferredHotResolve : mDeferredHotResolveList) |
| 6722 | { |
| 6723 | addr_target resolveTargetAddr = deferredHotResolve->mNewAddr; |
| 6724 | |
| 6725 | findName = deferredHotResolve->mName; |
| 6726 | if (mDbgFlavor == DbgFlavor_MS) |
| 6727 | { |
| 6728 | // ... why do we need to find these variables in the variable map instead of the symbol name map? |
| 6729 | } |
| 6730 | |
| 6731 | auto itr = mainModule->mStaticVariableMap.find(findName.c_str()); |
| 6732 | if (itr != mainModule->mStaticVariableMap.end()) |
| 6733 | { |
| 6734 | DbgVariable* variable = itr->second; |
| 6735 | resolveTargetAddr = mDebugTarget->GetStaticAddress(variable); |
| 6736 | } |
| 6737 | else |
| 6738 | { |
| 6739 | auto symbolEntry = mainModule->mSymbolNameMap.Find(findName.c_str()); |
| 6740 | |
| 6741 | if (symbolEntry != NULL) |
| 6742 | { |
| 6743 | resolveTargetAddr = symbolEntry->mValue->mAddress; |
| 6744 | } |
| 6745 | else |
| 6746 | { |
| 6747 | if (deferredHotResolve->mName == "__ImageBase") |
| 6748 | { |
| 6749 | resolveTargetAddr = (addr_target)mainModule->mImageBase; |
| 6750 | } |
| 6751 | else |
| 6752 | { |
| 6753 | resolveTargetAddr = mainModule->LocateSymbol(deferredHotResolve->mName); |
| 6754 | if (resolveTargetAddr == 0) |
| 6755 | { |
| 6756 | failSet.Add(deferredHotResolve->mName); |
| 6757 | continue; |
| 6758 | } |
| 6759 | } |
| 6760 | } |
| 6761 | } |
| 6762 | DoReloc(deferredHotResolve->mHotTargetSection, deferredHotResolve->mReloc, resolveTargetAddr, NULL); |
| 6763 | } |
| 6764 | mDeferredHotResolveList.Clear(); |
| 6765 | |
| 6766 | if (!failSet.IsEmpty()) |
| 6767 | { |
| 6768 | bool handled = false; |
nothing calls this directly
no test coverage detected