Skip to content

Commit 008e6ee

Browse files
authored
Merge pull request #77273 from Azoy/fix-builtin-array-reconstruct
Fix Builtin.FixedArray type reconstruction and change integer type mangling
2 parents 110041b + 79689be commit 008e6ee

File tree

12 files changed

+129
-13
lines changed

12 files changed

+129
-13
lines changed

docs/ABI/Mangling.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ Types
715715
type ::= 'Xe' // error or unresolved type
716716

717717
#if SWIFT_RUNTIME_VERSION >= 6.TBD
718-
type ::= '$' 'n'? NATURAL_ZERO // integer type
718+
type ::= '$' 'n'? INDEX // integer type
719719
#endif
720720

721721
bound-generic-type ::= type 'y' (type* '_')* type* retroactive-conformance* 'G' // one type-list per nesting level of type

include/swift/AST/ASTDemangler.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ class ASTBuilder {
6868
/// For saving and restoring generic parameters.
6969
llvm::SmallVector<decltype(ParameterPacks), 2> ParameterPackStack;
7070

71+
/// The depth and index of each value parameter in the current generic
72+
/// signature. We need this becasue the mangling for a type parameter
73+
/// doesn't record whether it is a value or not; we find the correct
74+
/// depth and index in this array, and use its value-ness.
75+
llvm::SmallVector<std::tuple<std::pair<unsigned, unsigned>, Type>, 1> ValueParameters;
76+
77+
/// For saving and restoring generic parameters.
78+
llvm::SmallVector<decltype(ValueParameters), 1> ValueParametersStack;
79+
7180
/// This builder doesn't perform "on the fly" substitutions, so we preserve
7281
/// all pack expansions. We still need an active expansion stack though,
7382
/// for the dummy implementation of these methods:
@@ -93,6 +102,12 @@ class ASTBuilder {
93102
for (auto *paramTy : genericSig.getGenericParams()) {
94103
if (paramTy->isParameterPack())
95104
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
105+
106+
if (paramTy->isValue()) {
107+
auto pair = std::make_pair(paramTy->getDepth(), paramTy->getIndex());
108+
auto tuple = std::make_tuple(pair, paramTy->getValueType());
109+
ValueParameters.emplace_back(tuple);
110+
}
96111
}
97112
}
98113

@@ -235,6 +250,8 @@ class ASTBuilder {
235250

236251
Type createNegativeIntegerType(intptr_t value);
237252

253+
Type createBuiltinFixedArrayType(Type size, Type element);
254+
238255
BuiltGenericSignature
239256
createGenericSignature(ArrayRef<BuiltType> params,
240257
ArrayRef<BuiltRequirement> requirements);

include/swift/Demangling/TypeDecoder.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ void decodeRequirement(
455455
BuilderType &Builder) {
456456
for (auto &child : *node) {
457457
if (child->getKind() == Demangle::Node::Kind::DependentGenericParamCount ||
458-
child->getKind() == Demangle::Node::Kind::DependentGenericParamPackMarker)
458+
child->getKind() == Demangle::Node::Kind::DependentGenericParamPackMarker ||
459+
child->getKind() == Demangle::Node::Kind::DependentGenericParamValueMarker)
459460
continue;
460461

461462
if (child->getNumChildren() != 2)
@@ -1529,6 +1530,23 @@ class TypeDecoder {
15291530
return Builder.createNegativeIntegerType((intptr_t)Node->getIndex());
15301531
}
15311532

1533+
case NodeKind::BuiltinFixedArray: {
1534+
if (Node->getNumChildren() < 2)
1535+
return MAKE_NODE_TYPE_ERROR(Node,
1536+
"fewer children (%zu) than required (2)",
1537+
Node->getNumChildren());
1538+
1539+
auto size = decodeMangledType(Node->getChild(0), depth + 1);
1540+
if (size.isError())
1541+
return size;
1542+
1543+
auto element = decodeMangledType(Node->getChild(1), depth + 1);
1544+
if (element.isError())
1545+
return element;
1546+
1547+
return Builder.createBuiltinFixedArrayType(size.getType(), element.getType());
1548+
}
1549+
15321550
// TODO: Handle OpaqueReturnType, when we're in the middle of reconstructing
15331551
// the defining decl
15341552
default:

include/swift/RemoteInspection/TypeRefBuilder.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,12 @@ class TypeRefBuilder {
933933
return nullptr;
934934
}
935935

936+
const TypeRef *createBuiltinFixedArrayType(const TypeRef *size,
937+
const TypeRef *element) {
938+
// FIXME: implement
939+
return nullptr;
940+
}
941+
936942
// Construct a bound generic type ref along with the parent type info
937943
// The parent list contains every parent type with at least 1 generic
938944
// type parameter.

lib/AST/ASTDemangler.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,11 @@ void ASTBuilder::pushGenericParams(ArrayRef<std::pair<unsigned, unsigned>> param
845845
void ASTBuilder::popGenericParams() {
846846
ParameterPacks = ParameterPackStack.back();
847847
ParameterPackStack.pop_back();
848+
849+
if (!ValueParametersStack.empty()) {
850+
ValueParameters = ValueParametersStack.back();
851+
ValueParametersStack.pop_back();
852+
}
848853
}
849854

850855
Type ASTBuilder::createGenericTypeParameterType(unsigned depth,
@@ -857,6 +862,17 @@ Type ASTBuilder::createGenericTypeParameterType(unsigned depth,
857862
}
858863
}
859864

865+
if (!ValueParameters.empty()) {
866+
for (auto tuple : ValueParameters) {
867+
auto pair = std::get<std::pair<unsigned, unsigned>>(tuple);
868+
auto type = std::get<Type>(tuple);
869+
870+
if (pair.first == depth && pair.second == index) {
871+
return GenericTypeParamType::getValue(depth, index, type, Ctx);
872+
}
873+
}
874+
}
875+
860876
return GenericTypeParamType::getType(depth, index, Ctx);
861877
}
862878

@@ -1049,6 +1065,11 @@ Type ASTBuilder::createNegativeIntegerType(intptr_t value) {
10491065
return IntegerType::get(std::to_string(value), /*isNegative*/ true, Ctx);
10501066
}
10511067

1068+
Type ASTBuilder::createBuiltinFixedArrayType(Type size, Type element) {
1069+
return BuiltinFixedArrayType::get(size->getCanonicalType(),
1070+
element->getCanonicalType());
1071+
}
1072+
10521073
GenericSignature
10531074
ASTBuilder::createGenericSignature(ArrayRef<BuiltType> builtParams,
10541075
ArrayRef<BuiltRequirement> requirements) {
@@ -1197,9 +1218,18 @@ CanGenericSignature ASTBuilder::demangleGenericSignature(
11971218
// we introduce the parameter packs from the nominal's generic signature.
11981219
ParameterPackStack.push_back(ParameterPacks);
11991220
ParameterPacks.clear();
1221+
1222+
ValueParametersStack.push_back(ValueParameters);
1223+
ValueParameters.clear();
12001224
for (auto *paramTy : baseGenericSig.getGenericParams()) {
12011225
if (paramTy->isParameterPack())
12021226
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
1227+
1228+
if (paramTy->isValue()) {
1229+
auto pair = std::make_pair(paramTy->getDepth(), paramTy->getIndex());
1230+
auto tuple = std::make_tuple(pair, paramTy->getValueType());
1231+
ValueParameters.emplace_back(tuple);
1232+
}
12031233
}
12041234
SWIFT_DEFER { popGenericParams(); };
12051235

lib/AST/ASTMangler.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,11 +1685,14 @@ void ASTMangler::appendType(Type type, GenericSignature sig,
16851685

16861686
appendOperator("$");
16871687

1688+
auto value = integer->getValue().getSExtValue();
1689+
16881690
if (integer->isNegative()) {
1689-
appendOperator("n");
1691+
appendOperator("n", Index(-value));
1692+
} else {
1693+
appendOperator("", Index(value));
16901694
}
16911695

1692-
appendOperator(integer->getDigitsText());
16931696
return;
16941697
}
16951698

@@ -3629,10 +3632,17 @@ void ASTMangler::appendGenericSignatureParts(
36293632
ArrayRef<Requirement> requirements = parts.requirements;
36303633
ArrayRef<InverseRequirement> inverseRequirements = parts.inverses;
36313634

3632-
// Mangle which generic parameters are pack parameters.
3635+
// Mangle the kind for each generic parameter.
36333636
for (auto param : params) {
3637+
// Regular type parameters have no marker.
3638+
36343639
if (param->isParameterPack())
36353640
appendOpWithGenericParamIndex("Rv", param);
3641+
3642+
if (param->isValue()) {
3643+
appendType(param->getValueType(), sig);
3644+
appendOpWithGenericParamIndex("RV", param);
3645+
}
36363646
}
36373647

36383648
// Mangle the requirements.

lib/Demangling/Demangler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4450,11 +4450,11 @@ NodePointer Demangler::demangleIntegerType() {
44504450
switch (peekChar()) {
44514451
case 'n':
44524452
nextChar();
4453-
integer = createNode(Node::Kind::NegativeInteger, -demangleNatural());
4453+
integer = createNode(Node::Kind::NegativeInteger, -demangleIndex());
44544454
break;
44554455

44564456
default:
4457-
integer = createNode(Node::Kind::Integer, demangleNatural());
4457+
integer = createNode(Node::Kind::Integer, demangleIndex());
44584458
break;
44594459
}
44604460

lib/Demangling/NodePrinter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,8 @@ class NodePrinter {
10661066
auto child = Node->getChild(firstRequirement);
10671067
if (child->getKind() == Node::Kind::Type)
10681068
child = child->getChild(0);
1069-
if (child->getKind() != Node::Kind::DependentGenericParamPackMarker) {
1069+
if (child->getKind() != Node::Kind::DependentGenericParamPackMarker &&
1070+
child->getKind() != Node::Kind::DependentGenericParamValueMarker) {
10701071
break;
10711072
}
10721073
}

lib/Demangling/Remangler.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3996,22 +3996,25 @@ mangleNonUniqueExtendedExistentialTypeShapeSymbolicReference(Node *node,
39963996
}
39973997

39983998
ManglingError Remangler::mangleInteger(Node *node, unsigned int depth) {
3999-
Buffer << "$" << node->getIndex();
3999+
Buffer << "$";
4000+
mangleIndex(node->getIndex());
40004001

40014002
return ManglingError::Success;
40024003
}
40034004

40044005
ManglingError Remangler::mangleNegativeInteger(Node *node, unsigned int depth) {
4005-
Buffer << "$n" << -node->getIndex();
4006+
Buffer << "$n";
4007+
mangleIndex(-node->getIndex());
40064008

40074009
return ManglingError::Success;
40084010
}
40094011

40104012
ManglingError Remangler::mangleDependentGenericParamValueMarker(Node *node,
40114013
unsigned depth) {
4012-
DEMANGLER_ASSERT(node->getNumChildren() == 1, node);
4013-
DEMANGLER_ASSERT(node->getChild(0)->getKind() == Node::Kind::Type, node);
4014-
RETURN_IF_ERROR(mangleType(node->getChild(0)->getChild(1), depth + 1));
4014+
DEMANGLER_ASSERT(node->getNumChildren() == 2, node);
4015+
DEMANGLER_ASSERT(node->getChild(0)->getChild(0)->getKind() == Node::Kind::DependentGenericParamType, node);
4016+
DEMANGLER_ASSERT(node->getChild(1)->getKind() == Node::Kind::Type, node);
4017+
RETURN_IF_ERROR(mangleType(node->getChild(1), depth + 1));
40154018
Buffer << "RV";
40164019
mangleDependentGenericParamIndex(node->getChild(0)->getChild(0));
40174020
return ManglingError::Success;

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,13 @@ class DecodedMetadataBuilder {
24542454
TypeLookupErrorOr<BuiltType> createNegativeIntegerType(intptr_t value) {
24552455
return BuiltType(value);
24562456
}
2457+
2458+
TypeLookupErrorOr<BuiltType> createBuiltinFixedArrayType(BuiltType size,
2459+
BuiltType element) {
2460+
return BuiltType(swift_getFixedArrayTypeMetadata(MetadataState::Abstract,
2461+
size.getValue(),
2462+
element.getMetadata()));
2463+
}
24572464
};
24582465

24592466
}

test/DebugInfo/value-generics.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %target-swift-frontend %s -emit-ir -g -enable-builtin-module -enable-experimental-feature ValueGenerics -disable-experimental-parser-round-trip -disable-availability-checking -o - | %FileCheck %s
2+
3+
import Builtin
4+
5+
struct Vector<let N: Int, Element: ~Copyable>: ~Copyable {
6+
let storage: Builtin.FixedArray<N, Element>
7+
}
8+
9+
extension Vector: Copyable where Element: Copyable {}
10+
11+
// CHECK-DAG: !DICompositeType({{.*}}name: "Builtin.FixedArray", {{.*}}identifier: "$sxq_BVD"
12+
func genericBA<let N: Int, Element>(_: Builtin.FixedArray<N, Element>) {}
13+
14+
// CHECK-DAG: !DICompositeType({{.*}}name: "$s4main6VectorVyxq_GD"
15+
func genericV<let N: Int, Element>(_: Vector<N, Element>) {}
16+
17+
// CHECK-DAG: !DICompositeType({{.*}}name: "Builtin.FixedArray", {{.*}}identifier: "$s$3_SiBVD"
18+
func concreteBA(_: Builtin.FixedArray<4, Int>) {}
19+
20+
// CHECK-DAG: !DICompositeType({{.*}}name: "$s4main6VectorVy$1_SiGD"
21+
func concreteV(_: Vector<2, Int>) {}

test/Demangle/Inputs/manglings.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,3 +480,6 @@ $s2hi1SV1iSivy ---> hi.S.i.read2 : Swift.Int
480480
$s2hi1SVIetMIy_TC ---> coroutine continuation prototype for @escaping @convention(thin) @convention(method) @yield_once_2 (@unowned hi.S) -> ()
481481
$s4mainAAyyycAA1CCFTTI ---> identity thunk of main.main(main.C) -> () -> ()
482482
$s4mainAAyyycAA1CCFTTH ---> hop to main actor thunk of main.main(main.C) -> () -> ()
483+
484+
$s4main6VectorVy$1_SiG ---> main.Vector<2, Swift.Int>
485+
$s$n3_SSBV ---> Builtin.FixedArray<-4, Swift.String>

0 commit comments

Comments
 (0)