static const TypeContextDescriptor * _findNominalTypeDescriptor(Demangle::NodePointer node, Demangle::Demangler &Dem) { const TypeContextDescriptor *foundNominal = nullptr; auto &T = TypeMetadataRecords.get(); // If we have a symbolic reference to a context, resolve it immediately. NodePointer symbolicNode = node; if (symbolicNode->getKind() == Node::Kind::Type) symbolicNode = symbolicNode->getChild(0); if (symbolicNode->getKind() == Node::Kind::SymbolicReference) return cast<TypeContextDescriptor>( (const ContextDescriptor *)symbolicNode->getIndex()); auto mangledName = Demangle::mangleNode(node, [&](const void *context) -> NodePointer { return _buildDemanglingForContext( (const ContextDescriptor *) context, {}, false, Dem); }); // Look for an existing entry. // Find the bucket for the metadata entry. if (auto Value = T.NominalCache.find(mangledName)) return Value->getDescription(); // Check type metadata records foundNominal = _searchTypeMetadataRecords(T, node); // Check protocol conformances table. Note that this has no support for // resolving generic types yet. if (!foundNominal) foundNominal = _searchConformancesByMangledTypeName(node); if (foundNominal) { T.NominalCache.getOrInsert(mangledName, foundNominal); } return foundNominal; }
static const ProtocolDescriptor * _findProtocolDescriptor(const Demangle::NodePointer &node, Demangle::Demangler &Dem, std::string &mangledName) { const ProtocolDescriptor *foundProtocol = nullptr; auto &T = Protocols.get(); // If we have a symbolic reference to a context, resolve it immediately. NodePointer symbolicNode = node; if (symbolicNode->getKind() == Node::Kind::Type) symbolicNode = symbolicNode->getChild(0); if (symbolicNode->getKind() == Node::Kind::SymbolicReference) return cast<ProtocolDescriptor>( (const ContextDescriptor *)symbolicNode->getIndex()); mangledName = Demangle::mangleNode(node, [&](const void *context) -> NodePointer { return _buildDemanglingForContext( (const ContextDescriptor *) context, {}, Dem); }); // Look for an existing entry. // Find the bucket for the metadata entry. if (auto Value = T.ProtocolCache.find(mangledName)) return Value->getDescription(); // Check type metadata records foundProtocol = _searchProtocolRecords(T, node); if (foundProtocol) { T.ProtocolCache.getOrInsert(mangledName, foundProtocol); } return foundProtocol; }
void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) { if (!node->hasChildren()) { Out << "n_"; return; } // The first child is always a kind that specifies the type of param that we // have. NodePointer firstChild = node->getChild(0); unsigned kindValue = firstChild->getIndex(); auto kind = FunctionSigSpecializationParamKind(kindValue); switch (kind) { case FunctionSigSpecializationParamKind::ConstantPropFunction: Out << "cpfr"; mangleIdentifier(node->getChild(1).get()); Out << '_'; return; case FunctionSigSpecializationParamKind::ConstantPropGlobal: Out << "cpg"; mangleIdentifier(node->getChild(1).get()); Out << '_'; return; case FunctionSigSpecializationParamKind::ConstantPropInteger: Out << "cpi" << node->getChild(1)->getText() << '_'; return; case FunctionSigSpecializationParamKind::ConstantPropFloat: Out << "cpfl" << node->getChild(1)->getText() << '_'; return; case FunctionSigSpecializationParamKind::ConstantPropString: { Out << "cpse"; StringRef encodingStr = node->getChild(1)->getText(); if (encodingStr == "u8") Out << '0'; else if (encodingStr == "u16") Out << '1'; else unreachable("Unknown encoding"); Out << 'v'; mangleIdentifier(node->getChild(2).get()); Out << '_'; return; } case FunctionSigSpecializationParamKind::ClosureProp: Out << "cl"; mangleIdentifier(node->getChild(1).get()); for (unsigned i = 2, e = node->getNumChildren(); i != e; ++i) { mangleType(node->getChild(i).get()); } Out << '_'; return; case FunctionSigSpecializationParamKind::BoxToValue: Out << "i_"; return; case FunctionSigSpecializationParamKind::BoxToStack: Out << "k_"; return; default: if (kindValue & unsigned(FunctionSigSpecializationParamKind::Dead)) Out << 'd'; if (kindValue & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) Out << 'g'; if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA)) Out << 's'; Out << '_'; return; } }