Skip to content

Commit b2d7d7d

Browse files
authored
Merge pull request #63426 from adrian-prantl/104842055
Debug info support for variadic generics.
2 parents ccd22cc + c347de1 commit b2d7d7d

File tree

5 files changed

+119
-2
lines changed

5 files changed

+119
-2
lines changed

lib/IRGen/IRGenDebugInfo.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
243243
Optional<SILLocation> Loc);
244244
void emitTypeMetadata(IRGenFunction &IGF, llvm::Value *Metadata,
245245
unsigned Depth, unsigned Index, StringRef Name);
246+
void emitPackCountParameter(IRGenFunction &IGF, llvm::Value *Metadata,
247+
SILDebugVariable VarInfo);
246248

247249
/// Return the DIBuilder.
248250
llvm::DIBuilder &getBuilder() { return DBuilder; }
@@ -1528,11 +1530,16 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
15281530
File, FwdDeclLine, Flags, MangledName);
15291531
}
15301532

1531-
case TypeKind::SILPack:
15321533
case TypeKind::Pack:
1533-
case TypeKind::PackExpansion:
15341534
llvm_unreachable("Unimplemented!");
15351535

1536+
case TypeKind::SILPack:
1537+
case TypeKind::PackExpansion:
1538+
//assert(SizeInBits == CI.getTargetInfo().getPointerWidth(0));
1539+
return createPointerSizedStruct(Scope,
1540+
MangledName,
1541+
MainFile, 0, Flags, MangledName);
1542+
15361543
case TypeKind::BuiltinTuple:
15371544
llvm_unreachable("BuiltinTupleType should not show up here");
15381545

@@ -2977,6 +2984,25 @@ void IRGenDebugInfoImpl::emitTypeMetadata(IRGenFunction &IGF,
29772984
ArtificialValue);
29782985
}
29792986

2987+
void IRGenDebugInfoImpl::emitPackCountParameter(IRGenFunction &IGF,
2988+
llvm::Value *Metadata,
2989+
SILDebugVariable VarInfo) {
2990+
if (Opts.DebugInfoLevel <= IRGenDebugInfoLevel::LineTables)
2991+
return;
2992+
2993+
// Don't emit debug info in transparent functions.
2994+
auto *DS = IGF.getDebugScope();
2995+
if (!DS || DS->getInlinedFunction()->isTransparent())
2996+
return;
2997+
2998+
Type IntTy = IGM.Context.getIntType();
2999+
auto &TI = IGM.getTypeInfoForUnlowered(IntTy);
3000+
auto DbgTy = *CompletedDebugTypeInfo::getFromTypeInfo(IntTy, TI, IGM);
3001+
emitVariableDeclaration(
3002+
IGF.Builder, Metadata, DbgTy, IGF.getDebugScope(), {}, VarInfo,
3003+
IGF.isAsync() ? CoroDirectValue : DirectValue, ArtificialValue);
3004+
}
3005+
29803006
SILLocation::FilenameAndLocation
29813007
IRGenDebugInfoImpl::decodeSourceLoc(SourceLoc SL) {
29823008
auto &Cached = FilenameAndLocationCache[SL.getOpaquePointerValue()];
@@ -3108,6 +3134,13 @@ void IRGenDebugInfo::emitTypeMetadata(IRGenFunction &IGF, llvm::Value *Metadata,
31083134
Depth, Index, Name);
31093135
}
31103136

3137+
void IRGenDebugInfo::emitPackCountParameter(IRGenFunction &IGF,
3138+
llvm::Value *Metadata,
3139+
SILDebugVariable VarInfo) {
3140+
static_cast<IRGenDebugInfoImpl *>(this)->emitPackCountParameter(IGF, Metadata,
3141+
VarInfo);
3142+
}
3143+
31113144
llvm::DIBuilder &IRGenDebugInfo::getBuilder() {
31123145
return static_cast<IRGenDebugInfoImpl *>(this)->getBuilder();
31133146
}

lib/IRGen/IRGenDebugInfo.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,11 @@ class IRGenDebugInfo {
188188
void emitTypeMetadata(IRGenFunction &IGF, llvm::Value *Metadata,
189189
unsigned Depth, unsigned Index, StringRef Name);
190190

191+
/// Emit debug info for the IR function parameter holding the size of one or
192+
/// more parameter / type packs.
193+
void emitPackCountParameter(IRGenFunction &IGF, llvm::Value *Metadata,
194+
SILDebugVariable VarInfo);
195+
191196
/// Return the DIBuilder.
192197
llvm::DIBuilder &getBuilder();
193198

lib/IRGen/IRGenSIL.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ class IRGenSILFunction :
415415
llvm::SmallDenseMap<StackSlotKey, Address, 8> ShadowStackSlots;
416416
llvm::SmallDenseMap<llvm::Value *, Address, 8> TaskAllocStackSlots;
417417
llvm::SmallDenseMap<Decl *, Identifier, 8> AnonymousVariables;
418+
llvm::SmallDenseSet<llvm::Value *, 4> PackShapeExpressions;
418419
/// To avoid inserting elements into ValueDomPoints twice.
419420
llvm::SmallDenseSet<llvm::Value *, 8> ValueVariables;
420421
/// Holds the DominancePoint of values that are storage for a source variable.
@@ -1097,6 +1098,22 @@ class IRGenSILFunction :
10971098
runtimeTy.visit([&](CanType t) {
10981099
if (auto archetype = dyn_cast<ArchetypeType>(t))
10991100
emitTypeMetadataRef(archetype);
1101+
else if (auto packArchetype = dyn_cast<PackArchetypeType>(t))
1102+
emitTypeMetadataRef(packArchetype);
1103+
else if (auto packtype = dyn_cast<SILPackType>(t)) {
1104+
llvm::Value *Shape = emitPackShapeExpression(t);
1105+
if (PackShapeExpressions.insert(Shape).second) {
1106+
llvm::SmallString<8> Buf;
1107+
llvm::raw_svector_ostream OS(Buf);
1108+
unsigned Position = PackShapeExpressions.size();
1109+
OS << "$pack_count_" << Position;
1110+
SILDebugVariable Var(OS.str(), true, 0);
1111+
Shape = emitShadowCopyIfNeeded(Shape, getDebugScope(), Var, false,
1112+
false /*was move*/);
1113+
if (IGM.DebugInfo)
1114+
IGM.DebugInfo->emitPackCountParameter(*this, Shape, Var);
1115+
}
1116+
}
11001117
});
11011118
}
11021119

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// RUN: %target-swift-frontend -emit-ir %s -g -o - \
2+
// RUN: -enable-experimental-feature VariadicGenerics \
3+
// RUN: -parse-as-library -module-name a | %FileCheck %s
4+
5+
public func f1<T...>(ts: repeat each T) {
6+
// CHECK: define {{.*}} @"$s1a2f12tsyxxQp_tlF"(%swift.opaque** {{.*}}, i{{32|64}} [[COUNT1_1:.*]], %swift.type** {{.*}})
7+
// CHECK-DAG: store i{{32|64}} [[COUNT1_1]], i{{32|64}}* %[[COUNT1_1_A:.*]], align
8+
// CHECK-DAG: call void @llvm.dbg.declare({{.*}}[[COUNT1_1_A]], metadata ![[COUNT1_1_VAR:[0-9]+]], metadata !DIExpression())
9+
// CHECK-LABEL: ret void
10+
}
11+
12+
public func f2<U..., V...>(us: repeat each U, vs: repeat each V) {
13+
// CHECK: define {{.*}} @"$s1a2f22us2vsyxxQp_q_q_Qptr0_lF"(%swift.opaque** {{.*}}, %swift.opaque** {{.*}}, i{{32|64}} [[COUNT2_1:.*]], i{{32|64}} [[COUNT2_2:.*]], %swift.type** {{.*}}, %swift.type** {{.*}})
14+
// CHECK-DAG: store i{{32|64}} [[COUNT2_1]], i{{32|64}}* %[[COUNT2_1_A:.*]], align
15+
// CHECK-DAG: store i{{32|64}} [[COUNT2_2]], i{{32|64}}* %[[COUNT2_2_A:.*]], align
16+
// CHECK-DAG: call void @llvm.dbg.declare({{.*}}[[COUNT2_1_A]], metadata ![[COUNT2_1_VAR:[0-9]+]], metadata !DIExpression())
17+
// CHECK-DAG: call void @llvm.dbg.declare({{.*}}[[COUNT2_2_A]], metadata ![[COUNT2_2_VAR:[0-9]+]], metadata !DIExpression())
18+
// CHECK-LABEL: ret void
19+
}
20+
21+
public func f3<T...>(ts: repeat each T, more_ts: repeat each T) {
22+
// CHECK: define {{.*}} @"$s1a2f32ts05more_B0yxxQp_xxQptlF"(%swift.opaque** {{.*}}, %swift.opaque** {{.*}}, i{{32|64}} [[COUNT3_1:.*]], %swift.type** {{.*}})
23+
// CHECK-DAG: store i{{32|64}} [[COUNT3_1]], i{{32|64}}* %[[COUNT3_1_A:.*]], align
24+
// CHECK-DAG: call void @llvm.dbg.declare({{.*}}[[COUNT3_1_A]], metadata ![[COUNT3_1_VAR:[0-9]+]], metadata !DIExpression())
25+
// CHECK-LABEL: ret void
26+
}
27+
28+
public func f4<U..., V...>(us: repeat (each U, each V)) {
29+
// CHECK: define {{.*}} @"$s1a2f42usyx_q_txQp_tq_Rhzr0_lF"(%swift.opaque** {{.*}}, i{{32|64}} [[COUNT4_1:.*]], %swift.type** {{.*}}, %swift.type** {{.*}})
30+
// CHECK-DAG: store i{{32|64}} [[COUNT4_1]], i{{32|64}}* %[[COUNT4_1_A:.*]], align
31+
// CHECK-DAG: call void @llvm.dbg.declare({{.*}}[[COUNT4_1_A]], metadata ![[COUNT4_1_VAR:[0-9]+]], metadata !DIExpression())
32+
// CHECK-LABEL: ret void
33+
}
34+
35+
// CHECK-LABEL: !DICompileUnit
36+
// CHECK-DAG: [[COUNT1_1_VAR]] = !DILocalVariable(name: "$pack_count_1",{{.*}} flags: DIFlagArtificial)
37+
// CHECK-DAG: [[COUNT2_1_VAR]] = !DILocalVariable(name: "$pack_count_1",{{.*}} flags: DIFlagArtificial)
38+
// CHECK-DAG: [[COUNT2_2_VAR]] = !DILocalVariable(name: "$pack_count_2",{{.*}} flags: DIFlagArtificial)
39+
// CHECK-DAG: [[COUNT3_1_VAR]] = !DILocalVariable(name: "$pack_count_1",{{.*}} flags: DIFlagArtificial)
40+
// CHECK-DAG: [[COUNT4_1_VAR]] = !DILocalVariable(name: "$pack_count_1",{{.*}} flags: DIFlagArtificial)
41+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %target-swift-frontend -emit-ir %s -g -o - \
2+
// RUN: -enable-experimental-feature VariadicGenerics \
3+
// RUN: -parse-as-library -module-name a | %FileCheck %s
4+
5+
public func foo<T...>(args: repeat each T) {
6+
// CHECK: define {{.*}} @"$s1a3foo4argsyxxQp_tlF"
7+
// CHECK-SAME: %swift.type** %[[TYPE_PACK_ARG:.*]])
8+
// CHECK: %[[TYPE_PACK_ALLOCA:.*]] = alloca %swift.type**
9+
// CHECK: call void @llvm.dbg.declare(metadata %swift.type*** %[[TYPE_PACK_ALLOCA]], metadata ![[TYPE_PACK_VAR:[0-9]+]], metadata !DIExpression())
10+
// CHECK: %[[ARGS_ALLOCA:.*]] = alloca %swift.opaque**
11+
// CHECK-DAG: call void @llvm.dbg.declare(metadata %swift.opaque*** %[[ARGS_ALLOCA]], metadata ![[ARGS_VAR:[0-9]+]], metadata !DIExpression(DW_OP_deref))
12+
// CHECK-DAG: store %swift.type** %[[TYPE_PACK_ARG]], %swift.type*** %[[TYPE_PACK_ALLOCA]]
13+
// CHECK-DAG: store %swift.opaque** %0, %swift.opaque*** %[[ARGS_ALLOCA]]
14+
// CHECK-DAG: ![[ARGS_VAR]] = !DILocalVariable(name: "args", arg: 1, {{.*}}line: [[@LINE-9]], type: ![[ARGS_LET_TY:[0-9]+]])
15+
// CHECK-DAG: ![[ARGS_LET_TY]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: ![[ARGS_TY:[0-9]+]])
16+
// CHECK-DAG: ![[ARGS_TY]] = !DICompositeType({{.*}}identifier: "$sxxQp_QSiD")
17+
// CHECK-DAG: ![[TYPE_PACK_VAR]] = !DILocalVariable(name: "$\CF\84_0_0", {{.*}}type: ![[TYPE_PACK_TYD:[0-9]+]], flags: DIFlagArtificial)
18+
// CHECK-DAG: ![[TYPE_PACK_TYD]] = !DIDerivedType(tag: DW_TAG_typedef, name: "T", {{.*}}baseType: ![[TYPE_PACK_TY:[0-9]+]]
19+
// CHECK-DAG: ![[TYPE_PACK_TY]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "$sBpD"
20+
}
21+

0 commit comments

Comments
 (0)