Browse Source

Work around MSVC 32 crashing reading of exported symbols in Mach-O

See https://bugs.llvm.org/show_bug.cgi?id=44433.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1282/head
Dimitar Dobrev 6 years ago committed by João Matos
parent
commit
709fcb6f7e
  1. 21
      src/CppParser/Parser.cpp
  2. 166
      src/Generator.Tests/ReadNativeSymbolsTest.cs

21
src/CppParser/Parser.cpp

@ -4385,14 +4385,21 @@ ParserResultKind Parser::ParseSharedLib(llvm::StringRef File,
NativeLib->Dependencies.push_back(lib); NativeLib->Dependencies.push_back(lib);
} }
} }
auto Error = llvm::Error::success(); // HACK: the correct way is with exported(Err) but it crashes with msvc 32
for (const auto& Entry : MachOObjectFile->exports(Error)) // see https://bugs.llvm.org/show_bug.cgi?id=44433
for (const auto& Symbol : MachOObjectFile->symbols())
{ {
NativeLib->Symbols.push_back(Entry.name()); if (Symbol.getName())
} {
if (Error) if ((Symbol.getFlags() & llvm::object::BasicSymbolRef::Flags::SF_Exported) &&
{ !(Symbol.getFlags() & llvm::object::BasicSymbolRef::Flags::SF_Undefined))
return ParserResultKind::Error; NativeLib->Symbols.push_back(Symbol.getName().get());
}
else
{
Symbol.getName().takeError();
return ParserResultKind::Error;
}
} }
return ParserResultKind::Success; return ParserResultKind::Success;
} }

166
src/Generator.Tests/ReadNativeSymbolsTest.cs

@ -217,87 +217,91 @@ namespace CppSharp.Generator.Tests
public void TestReadSymbolsOSX() public void TestReadSymbolsOSX()
{ {
var symbols = GetSymbols("libexpat-osx"); var symbols = GetSymbols("libexpat-osx");
Assert.AreEqual("_XML_ParserCreate_MM", symbols[0]); Assert.That(symbols, Is.EquivalentTo(
Assert.AreEqual("_XML_ParserCreateNS", symbols[1]); new[]
Assert.AreEqual("_XML_ParserCreate", symbols[2]); {
Assert.AreEqual("_XML_ParserReset", symbols[3]); "_XML_DefaultCurrent",
Assert.AreEqual("_XML_ParserFree", symbols[4]); "_XML_ErrorString",
Assert.AreEqual("_XML_ParseBuffer", symbols[5]); "_XML_ExpatVersion",
Assert.AreEqual("_XML_Parse", symbols[6]); "_XML_ExpatVersionInfo",
Assert.AreEqual("_XML_SetEncoding", symbols[7]); "_XML_ExternalEntityParserCreate",
Assert.AreEqual("_XML_SetEndElementHandler", symbols[8]); "_XML_FreeContentModel",
Assert.AreEqual("_XML_SetEndCdataSectionHandler", symbols[9]); "_XML_GetBase",
Assert.AreEqual("_XML_SetEndDoctypeDeclHandler", symbols[10]); "_XML_GetBuffer",
Assert.AreEqual("_XML_SetEndNamespaceDeclHandler", symbols[11]); "_XML_GetCurrentByteCount",
Assert.AreEqual("_XML_SetEntityDeclHandler", symbols[12]); "_XML_GetCurrentByteIndex",
Assert.AreEqual("_XML_SetElementHandler", symbols[13]); "_XML_GetCurrentColumnNumber",
Assert.AreEqual("_XML_SetElementDeclHandler", symbols[14]); "_XML_GetCurrentLineNumber",
Assert.AreEqual("_XML_SetExternalEntityRefHandlerArg", symbols[15]); "_XML_GetErrorCode",
Assert.AreEqual("_XML_SetExternalEntityRefHandler", symbols[16]); "_XML_GetFeatureList",
Assert.AreEqual("_XML_SetReturnNSTriplet", symbols[17]); "_XML_GetIdAttributeIndex",
Assert.AreEqual("_XML_SetUserData", symbols[18]); "_XML_GetInputContext",
Assert.AreEqual("_XML_SetUnparsedEntityDeclHandler", symbols[19]); "_XML_GetParsingStatus",
Assert.AreEqual("_XML_SetUnknownEncodingHandler", symbols[20]); "_XML_GetSpecifiedAttributeCount",
Assert.AreEqual("_XML_SetBase", symbols[21]); "_XML_MemFree",
Assert.AreEqual("_XML_SetStartElementHandler", symbols[22]); "_XML_MemMalloc",
Assert.AreEqual("_XML_SetStartCdataSectionHandler", symbols[23]); "_XML_MemRealloc",
Assert.AreEqual("_XML_SetStartDoctypeDeclHandler", symbols[24]); "_XML_Parse",
Assert.AreEqual("_XML_SetStartNamespaceDeclHandler", symbols[25]); "_XML_ParseBuffer",
Assert.AreEqual("_XML_SetSkippedEntityHandler", symbols[26]); "_XML_ParserCreate",
Assert.AreEqual("_XML_SetCharacterDataHandler", symbols[27]); "_XML_ParserCreateNS",
Assert.AreEqual("_XML_SetCommentHandler", symbols[28]); "_XML_ParserCreate_MM",
Assert.AreEqual("_XML_SetCdataSectionHandler", symbols[29]); "_XML_ParserFree",
Assert.AreEqual("_XML_SetProcessingInstructionHandler", symbols[30]); "_XML_ParserReset",
Assert.AreEqual("_XML_SetParamEntityParsing", symbols[31]); "_XML_ResumeParser",
Assert.AreEqual("_XML_SetDefaultHandlerExpand", symbols[32]); "_XML_SetAttlistDeclHandler",
Assert.AreEqual("_XML_SetDefaultHandler", symbols[33]); "_XML_SetBase",
Assert.AreEqual("_XML_SetDoctypeDeclHandler", symbols[34]); "_XML_SetCdataSectionHandler",
Assert.AreEqual("_XML_SetNotationDeclHandler", symbols[35]); "_XML_SetCharacterDataHandler",
Assert.AreEqual("_XML_SetNotStandaloneHandler", symbols[36]); "_XML_SetCommentHandler",
Assert.AreEqual("_XML_SetNamespaceDeclHandler", symbols[37]); "_XML_SetDefaultHandler",
Assert.AreEqual("_XML_SetAttlistDeclHandler", symbols[38]); "_XML_SetDefaultHandlerExpand",
Assert.AreEqual("_XML_SetXmlDeclHandler", symbols[39]); "_XML_SetDoctypeDeclHandler",
Assert.AreEqual("_XML_SetHashSalt", symbols[40]); "_XML_SetElementDeclHandler",
Assert.AreEqual("_XML_StopParser", symbols[41]); "_XML_SetElementHandler",
Assert.AreEqual("_XML_ExternalEntityParserCreate", symbols[42]); "_XML_SetEncoding",
Assert.AreEqual("_XML_ExpatVersionInfo", symbols[43]); "_XML_SetEndCdataSectionHandler",
Assert.AreEqual("_XML_ExpatVersion", symbols[44]); "_XML_SetEndDoctypeDeclHandler",
Assert.AreEqual("_XML_ErrorString", symbols[45]); "_XML_SetEndElementHandler",
Assert.AreEqual("_XML_UseParserAsHandlerArg", symbols[46]); "_XML_SetEndNamespaceDeclHandler",
Assert.AreEqual("_XML_UseForeignDTD", symbols[47]); "_XML_SetEntityDeclHandler",
Assert.AreEqual("_XML_GetBase", symbols[48]); "_XML_SetExternalEntityRefHandler",
Assert.AreEqual("_XML_GetBuffer", symbols[49]); "_XML_SetExternalEntityRefHandlerArg",
Assert.AreEqual("_XML_GetSpecifiedAttributeCount", symbols[50]); "_XML_SetHashSalt",
Assert.AreEqual("_XML_GetIdAttributeIndex", symbols[51]); "_XML_SetNamespaceDeclHandler",
Assert.AreEqual("_XML_GetInputContext", symbols[52]); "_XML_SetNotStandaloneHandler",
Assert.AreEqual("_XML_GetParsingStatus", symbols[53]); "_XML_SetNotationDeclHandler",
Assert.AreEqual("_XML_GetErrorCode", symbols[54]); "_XML_SetParamEntityParsing",
Assert.AreEqual("_XML_GetCurrentByteIndex", symbols[55]); "_XML_SetProcessingInstructionHandler",
Assert.AreEqual("_XML_GetCurrentByteCount", symbols[56]); "_XML_SetReturnNSTriplet",
Assert.AreEqual("_XML_GetCurrentLineNumber", symbols[57]); "_XML_SetSkippedEntityHandler",
Assert.AreEqual("_XML_GetCurrentColumnNumber", symbols[58]); "_XML_SetStartCdataSectionHandler",
Assert.AreEqual("_XML_GetFeatureList", symbols[59]); "_XML_SetStartDoctypeDeclHandler",
Assert.AreEqual("_XML_ResumeParser", symbols[60]); "_XML_SetStartElementHandler",
Assert.AreEqual("_XML_FreeContentModel", symbols[61]); "_XML_SetStartNamespaceDeclHandler",
Assert.AreEqual("_XML_MemMalloc", symbols[62]); "_XML_SetUnknownEncodingHandler",
Assert.AreEqual("_XML_MemRealloc", symbols[63]); "_XML_SetUnparsedEntityDeclHandler",
Assert.AreEqual("_XML_MemFree", symbols[64]); "_XML_SetUserData",
Assert.AreEqual("_XML_DefaultCurrent", symbols[65]); "_XML_SetXmlDeclHandler",
Assert.AreEqual("_XmlUtf8Encode", symbols[66]); "_XML_StopParser",
Assert.AreEqual("_XmlUtf16Encode", symbols[67]); "_XML_UseForeignDTD",
Assert.AreEqual("_XmlSizeOfUnknownEncoding", symbols[68]); "_XML_UseParserAsHandlerArg",
Assert.AreEqual("_XmlInitUnknownEncodingNS", symbols[69]); "_XmlGetUtf16InternalEncoding",
Assert.AreEqual("_XmlInitUnknownEncoding", symbols[70]); "_XmlGetUtf16InternalEncodingNS",
Assert.AreEqual("_XmlInitEncodingNS", symbols[71]); "_XmlGetUtf8InternalEncoding",
Assert.AreEqual("_XmlInitEncoding", symbols[72]); "_XmlGetUtf8InternalEncodingNS",
Assert.AreEqual("_XmlGetUtf8InternalEncodingNS", symbols[73]); "_XmlInitEncoding",
Assert.AreEqual("_XmlGetUtf8InternalEncoding", symbols[74]); "_XmlInitEncodingNS",
Assert.AreEqual("_XmlGetUtf16InternalEncodingNS", symbols[75]); "_XmlInitUnknownEncoding",
Assert.AreEqual("_XmlGetUtf16InternalEncoding", symbols[76]); "_XmlInitUnknownEncodingNS",
Assert.AreEqual("_XmlParseXmlDeclNS", symbols[77]); "_XmlParseXmlDecl",
Assert.AreEqual("_XmlParseXmlDecl", symbols[78]); "_XmlParseXmlDeclNS",
Assert.AreEqual("_XmlPrologStateInitExternalEntity", symbols[79]); "_XmlPrologStateInit",
Assert.AreEqual("_XmlPrologStateInit", symbols[80]); "_XmlPrologStateInitExternalEntity",
"_XmlSizeOfUnknownEncoding",
"_XmlUtf16Encode",
"_XmlUtf8Encode"
}));
} }
private static IList<string> GetSymbols(string library) private static IList<string> GetSymbols(string library)

Loading…
Cancel
Save