summaryrefslogtreecommitdiff
path: root/plugins/rtti/itanium.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-04-26 20:48:33 -0400
committerMason Reed <mason@vector35.com>2025-04-26 20:48:33 -0400
commitaf87287534221d6c5b0e3425dfcbc84800b7c2f0 (patch)
treefc5f733b78dcb2c2bcd6283923d82453f873a15d /plugins/rtti/itanium.cpp
parent51903e9ca5f269979b84ddcc7f5019b492d8b9ff (diff)
Fix some RTTI information being overwritten by empty class info
Finish verifying VMI base class info before applying data variable and symbol
Diffstat (limited to 'plugins/rtti/itanium.cpp')
-rw-r--r--plugins/rtti/itanium.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/plugins/rtti/itanium.cpp b/plugins/rtti/itanium.cpp
index f2b773b0..a6e85b4d 100644
--- a/plugins/rtti/itanium.cpp
+++ b/plugins/rtti/itanium.cpp
@@ -397,16 +397,10 @@ std::optional<ClassInfo> ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr)
auto typeInfo = TypeInfo(m_view, objectAddr);
auto className = DemangleNameItanium(m_view, allowMangledClassNames, typeInfo.type_name);
- if (!className.has_value())
+ if (!className.has_value() || className->empty())
return std::nullopt;
auto classInfo = ClassInfo{RTTIProcessorType::Itanium, className.value()};
- auto typeInfoName = fmt::format("_typeinfo_for_{}", classInfo.className);
- auto typeInfoSymbol = m_view->GetSymbolByAddress(objectAddr);
- if (typeInfoSymbol != nullptr)
- m_view->UndefineAutoSymbol(typeInfoSymbol);
- m_view->DefineAutoSymbol(new Symbol{DataSymbol, typeInfoName, objectAddr});
-
auto nameFromTypeInfoSymbol = [&](uint64_t addr) -> std::optional<std::string> {
auto sym = m_view->GetSymbolByAddress(addr);
if (sym == nullptr || sym->GetType() != ExternalSymbol)
@@ -457,7 +451,6 @@ std::optional<ClassInfo> ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr)
else if (typeInfoVariant == TIVVMIClass)
{
auto vmiClassTypeInfo = VMIClassTypeInfo(m_view, objectAddr);
- m_view->DefineDataVariable(objectAddr, Confidence(VMIClassTypeInfoType(m_view, vmiClassTypeInfo.base_count), 255));
for (const auto& baseInfo : vmiClassTypeInfo.base_info)
{
// Remove the flags and just get the offset
@@ -488,12 +481,20 @@ std::optional<ClassInfo> ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr)
auto baseClassInfo = BaseClassInfo {baseClassName.value(), offset};
classInfo.baseClasses.emplace_back(baseClassInfo);
}
+ m_view->DefineDataVariable(objectAddr, Confidence(VMIClassTypeInfoType(m_view, vmiClassTypeInfo.base_count), 255));
}
else
{
m_view->DefineDataVariable(objectAddr, Confidence(ClassTypeInfoType(m_view), 255));
}
+ // Defining the data variable was a success, so we can add the symbol now.
+ auto typeInfoName = fmt::format("_typeinfo_for_{}", classInfo.className);
+ auto typeInfoSymbol = m_view->GetSymbolByAddress(objectAddr);
+ if (typeInfoSymbol != nullptr)
+ m_view->UndefineAutoSymbol(typeInfoSymbol);
+ m_view->DefineAutoSymbol(new Symbol{DataSymbol, typeInfoName, objectAddr});
+
return classInfo;
}