From 0569365d79aaeb74aa134f52db13aa54f9619c56 Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Fri, 20 May 2022 20:42:12 -0400 Subject: Add BinaryView::ParseTypesFromSource for clang+typelibs --- binaryview.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) (limited to 'binaryview.cpp') diff --git a/binaryview.cpp b/binaryview.cpp index 21a37bee..35097619 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -3039,7 +3039,11 @@ bool BinaryView::ParseTypeString(const string& source, map options; + vector includeDirs; + + bool ok = BNParseTypesString(m_object, source.c_str(), options.data(), options.size(), + includeDirs.data(), includeDirs.size(), &result, &errorStr, &typesList); if (errorStr) { errors = errorStr; @@ -3068,6 +3072,75 @@ bool BinaryView::ParseTypeString(const string& source, map& options, const vector& includeDirs, + TypeParserResult& result, string& errors, const std::set& typesAllowRedefinition) +{ + BNQualifiedNameList typesList; + typesList.count = typesAllowRedefinition.size(); + typesList.names = new BNQualifiedName[typesList.count]; + size_t i = 0; + for (auto& type : typesAllowRedefinition) + { + typesList.names[i] = type.GetAPIObject(); + i++; + } + + vector coreOptions; + for (auto& option : options) + coreOptions.push_back(option.c_str()); + + vector coreIncludeDirs; + for (auto& includeDir : includeDirs) + coreIncludeDirs.push_back(includeDir.c_str()); + + BNTypeParserResult apiResult; + char* errorStr = nullptr; + + bool ok = BNParseTypesString(m_object, source.c_str(), coreOptions.data(), coreOptions.size(), + coreIncludeDirs.data(), coreIncludeDirs.size(), &apiResult, &errorStr, &typesList); + if (errorStr) + { + errors = errorStr; + BNFreeString(errorStr); + } + if (!ok) + return false; + + result.types.clear(); + for (size_t j = 0; j < apiResult.typeCount; ++j) + { + result.types.push_back({ + QualifiedName::FromAPIObject(&apiResult.types[j].name), + new Type(BNNewTypeReference(apiResult.types[j].type)), + apiResult.types[j].isUser + }); + } + + result.variables.clear(); + for (size_t j = 0; j < apiResult.variableCount; ++j) + { + result.variables.push_back({ + QualifiedName::FromAPIObject(&apiResult.variables[j].name), + new Type(BNNewTypeReference(apiResult.variables[j].type)), + apiResult.types[j].isUser + }); + } + + result.functions.clear(); + for (size_t j = 0; j < apiResult.functionCount; ++j) + { + result.functions.push_back({ + QualifiedName::FromAPIObject(&apiResult.functions[j].name), + new Type(BNNewTypeReference(apiResult.functions[j].type)), + apiResult.types[j].isUser + }); + } + + BNFreeTypeParserResult(&apiResult); + return true; +} + + map> BinaryView::GetTypes() { size_t count; -- cgit v1.3.1