Add runtime support

This commit is contained in:
Alejandro Alonso
2024-07-27 18:00:33 -07:00
parent 3e9c4633ca
commit 7c85261a77
27 changed files with 481 additions and 182 deletions

View File

@@ -266,6 +266,22 @@ _buildDemanglingForMetadataPack(MetadataPackPointer pack, size_t count,
return node;
}
static Demangle::NodePointer
_buildDemanglingForValue(size_t value, GenericValueDescriptor valueDescriptor,
Demangle::Demangler &Dem) {
switch (valueDescriptor.Type) {
case GenericValueType::Int: {
auto signedValue = (ssize_t)value;
if (signedValue < 0) {
return Dem.createNode(Node::Kind::NegativeInteger, signedValue);
}
return Dem.createNode(Node::Kind::Integer, signedValue);
}
}
}
/// Build an array of demangling trees for each generic argument to the given
/// generic type context descriptor.
///
@@ -297,7 +313,7 @@ static bool _buildDemanglingForGenericArgs(
auto packHeader = generics->getGenericPackShapeHeader();
auto packDescriptors = generics->getGenericPackShapeDescriptors();
llvm::SmallVector<MetadataOrPack> allGenericArgs;
llvm::SmallVector<MetadataPackOrValue> allGenericArgs;
auto numKeyArgs = 0;
for (auto param : generics->getGenericParams()) {
@@ -359,6 +375,25 @@ static bool _buildDemanglingForGenericArgs(
break;
}
case GenericParamKind::Value: {
// FIXME: We really want to get the specific value descriptor when
// building a demangling, but when all value parameters become non-key
// we lose the value header. May need to do extra work to walk up parents
// and find this parameter's specific value descriptor.
auto valueDescriptor = GenericValueDescriptor{GenericValueType::Int};
auto value = genericArg.getValue();
auto genericArgDemangling = _buildDemanglingForValue(value,
valueDescriptor,
Dem);
if (!genericArgDemangling)
return false;
demangledGenerics.push_back(genericArgDemangling);
break;
}
default:
// We don't know about this kind of parameter.
return false;