Support arbitrary parameter forms in MakeGeneratedFunctionDecl (#7654)

This allows generated functions to have different forms for different
parameters, and by-ref or by-value return forms. As a byproduct, this
allows generated functions to supply a return type _inst_ ID when they
have one, which preserves things like location information.
This commit is contained in:
Geoff Romer
2026-08-24 21:15:50 +00:00
committed by GitHub
parent 0745bda899
commit 1410795bf7
10 changed files with 146 additions and 132 deletions
@@ -120,19 +120,19 @@ fn InitNontrivialDtor() {
// CHECK:STDOUT: define void @_CInitVectorLike.Main() #0 !dbg !33 {
// CHECK:STDOUT: entry:
// CHECK:STDOUT: %_.var = alloca [1 x i8], align 1, !dbg !34
// CHECK:STDOUT: %.loc18_36.2.temp = alloca [16 x i8], align 8, !dbg !35
// CHECK:STDOUT: %.loc18_36.4.temp = alloca [3 x i32], align 4, !dbg !35
// CHECK:STDOUT: %.loc18_36.3.temp = alloca [16 x i8], align 8, !dbg !35
// CHECK:STDOUT: %.loc18_36.5.temp = alloca [3 x i32], align 4, !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !34
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.2.temp), !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.4.temp), !dbg !35
// CHECK:STDOUT: %.loc18_36.5.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 0, !dbg !35
// CHECK:STDOUT: %.loc18_36.8.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 1, !dbg !35
// CHECK:STDOUT: %.loc18_36.11.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 2, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 0, !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.3.temp), !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.5.temp), !dbg !35
// CHECK:STDOUT: %.loc18_36.6.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.5.temp, i32 0, i64 0, !dbg !35
// CHECK:STDOUT: %.loc18_36.9.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.5.temp, i32 0, i64 1, !dbg !35
// CHECK:STDOUT: %.loc18_36.12.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.5.temp, i32 0, i64 2, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.3.temp, i32 0, i32 0, !dbg !35
// CHECK:STDOUT: store ptr @array.loc13_50.15, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.end = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 8, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.end = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.3.temp, i32 0, i32 8, !dbg !35
// CHECK:STDOUT: store ptr getelementptr inbounds ([3 x i32], ptr @array.loc13_50.15, i32 1), ptr %initializer_list.initializer_list.call.init_list.end, align 8, !dbg !35
// CHECK:STDOUT: call void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr %.loc18_36.2.temp, ptr %_.var), !dbg !34
// CHECK:STDOUT: call void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr %.loc18_36.3.temp, ptr %_.var), !dbg !34
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !36
// CHECK:STDOUT: call void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr @array), !dbg !35
// CHECK:STDOUT: call void @_ZN11vector_likeD2Ev(ptr %_.var), !dbg !34
@@ -120,19 +120,19 @@ fn InitNontrivialDtor() {
// CHECK:STDOUT: define void @_CInitVectorLike.Main() #0 !dbg !33 {
// CHECK:STDOUT: entry:
// CHECK:STDOUT: %_.var = alloca [1 x i8], align 1, !dbg !34
// CHECK:STDOUT: %.loc18_36.2.temp = alloca [16 x i8], align 8, !dbg !35
// CHECK:STDOUT: %.loc18_36.4.temp = alloca [3 x i32], align 4, !dbg !35
// CHECK:STDOUT: %.loc18_36.3.temp = alloca [16 x i8], align 8, !dbg !35
// CHECK:STDOUT: %.loc18_36.5.temp = alloca [3 x i32], align 4, !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !34
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.2.temp), !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.4.temp), !dbg !35
// CHECK:STDOUT: %.loc18_36.5.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 0, !dbg !35
// CHECK:STDOUT: %.loc18_36.8.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 1, !dbg !35
// CHECK:STDOUT: %.loc18_36.11.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 2, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 0, !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.3.temp), !dbg !35
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.5.temp), !dbg !35
// CHECK:STDOUT: %.loc18_36.6.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.5.temp, i32 0, i64 0, !dbg !35
// CHECK:STDOUT: %.loc18_36.9.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.5.temp, i32 0, i64 1, !dbg !35
// CHECK:STDOUT: %.loc18_36.12.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.5.temp, i32 0, i64 2, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.3.temp, i32 0, i32 0, !dbg !35
// CHECK:STDOUT: store ptr @array.loc13_50.15, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 8, !dbg !35
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.3.temp, i32 0, i32 8, !dbg !35
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !35
// CHECK:STDOUT: call void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr %.loc18_36.2.temp, ptr %_.var), !dbg !34
// CHECK:STDOUT: call void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr %.loc18_36.3.temp, ptr %_.var), !dbg !34
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !36
// CHECK:STDOUT: call void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr @array), !dbg !35
// CHECK:STDOUT: call void @_ZN11vector_likeD2Ev(ptr %_.var), !dbg !34