From f719d1d5565f7b7b1237b8e183c2985f006fa3e4 Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Sat, 1 Mar 2025 00:34:12 -0500 Subject: Refactor and fixup MSVC and Itanium RTTI Bunch of misc fixes and performance improvements --- plugins/rtti/rtti.h | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'plugins/rtti/rtti.h') diff --git a/plugins/rtti/rtti.h b/plugins/rtti/rtti.h index 474253ec..e2913db4 100644 --- a/plugins/rtti/rtti.h +++ b/plugins/rtti/rtti.h @@ -16,7 +16,7 @@ namespace BinaryNinja::RTTI { { uint64_t funcAddr; - Ref SerializedMetadata(); + Ref SerializedMetadata() const; static VirtualFunctionInfo DeserializedMetadata(const Ref &metadata); }; @@ -26,7 +26,7 @@ namespace BinaryNinja::RTTI { uint64_t address; std::vector virtualFunctions; - Ref SerializedMetadata(); + Ref SerializedMetadata(bool serializeFunctions = true) const; static VirtualFunctionTableInfo DeserializedMetadata(const Ref &metadata); }; @@ -37,17 +37,29 @@ namespace BinaryNinja::RTTI { Itanium = 1, }; + struct BaseClassInfo + { + std::string className; + // TODO: This has to be optional, as we might need to resolve this at a later stage. + // TODO: The offset also might literally not exist. + uint64_t offset; + std::optional vft; + + Ref SerializedMetadata() const; + + static BaseClassInfo DeserializedMetadata(const Ref &metadata); + }; + // TODO: This needs to have some flags. Virtual, pure iirc. struct ClassInfo { RTTIProcessorType processor; std::string className; - std::optional baseClassName; - std::optional classOffset; + std::optional vft; - std::optional baseVft; + std::vector baseClasses; - Ref SerializedMetadata(); + Ref SerializedMetadata() const; static ClassInfo DeserializedMetadata(const Ref &metadata); }; @@ -63,7 +75,7 @@ namespace BinaryNinja::RTTI { virtual std::optional ProcessRTTI(uint64_t objectAddr) = 0; - virtual std::optional ProcessVFT(uint64_t vftAddr, ClassInfo &classInfo) = 0; + virtual std::optional ProcessVFT(uint64_t vftAddr, ClassInfo &classInfo, std::optional baseClassInfo) = 0; public: virtual ~RTTIProcessor() = default; -- cgit v1.3.1