@@ -1352,16 +1352,24 @@ class TypeRefBuilder {
1352
1352
(const char *)contextDescriptorFieldAddress,
1353
1353
*contextDescriptorOffset);
1354
1354
1355
- // Instead of a type descriptor this may just be a symbol reference, check that first
1355
+ // Instead of a type descriptor this may just be a reference to an external , check that first
1356
1356
if (auto symbol = OpaqueDynamicSymbolResolver (remote::RemoteAddress (contextTypeDescriptorAddress))) {
1357
1357
if (!symbol->isResolved ()) {
1358
- mangledTypeName = symbol->getSymbol ().str ();
1359
1358
Demangle::Context Ctx;
1360
1359
auto demangledRoot =
1361
- Ctx.demangleSymbolAsNode (mangledTypeName );
1360
+ Ctx.demangleSymbolAsNode (symbol-> getSymbol (). str () );
1362
1361
assert (demangledRoot->getKind () == Node::Kind::Global);
1363
- typeName =
1364
- nodeToString (demangledRoot->getChild (0 )->getChild (0 ));
1362
+ auto nomTypeDescriptorRoot = demangledRoot->getChild (0 );
1363
+ assert (nomTypeDescriptorRoot->getKind () == Node::Kind::NominalTypeDescriptor);
1364
+ auto typeRoot = nomTypeDescriptorRoot->getChild (0 );
1365
+ typeName = nodeToString (typeRoot);
1366
+
1367
+ auto typeMangling = Demangle::mangleNode (typeRoot);
1368
+ if (!typeMangling.isSuccess ())
1369
+ mangledTypeName = " " ;
1370
+ else
1371
+ mangledTypeName = typeMangling.result ();
1372
+
1365
1373
return std::make_pair (mangledTypeName, typeName);
1366
1374
} else if (symbol->getOffset ()) {
1367
1375
// If symbol is empty and has an offset, this is the resolved remote address
0 commit comments