Skip to content

Commit 70c52ef

Browse files
aykevldeadprogram
authored andcommitted
compiler: fix type names for generic named structs
Without this change, the compiler would probably have worked just fine but the generated types would look odd. You can see in the test case that it now doesn't use `main.Point` but rather the correct `main.Poin[float32]` etc.
1 parent 5078ce3 commit 70c52ef

File tree

3 files changed

+158
-42
lines changed

3 files changed

+158
-42
lines changed

compiler/compiler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ func (c *compilerContext) makeLLVMType(goType types.Type) llvm.Type {
393393
// in LLVM IR, named structs are implemented as named structs in
394394
// LLVM. This is because it is otherwise impossible to create
395395
// self-referencing types such as linked lists.
396-
llvmName := typ.Obj().Pkg().Path() + "." + typ.Obj().Name()
396+
llvmName := typ.String()
397397
llvmType := c.ctx.StructCreateNamed(llvmName)
398398
c.llvmTypes.Set(goType, llvmType) // avoid infinite recursion
399399
underlying := c.getLLVMType(st)

compiler/testdata/generics.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ func Add[T Coord](a, b Point[T]) Point[T] {
1818
func main() {
1919
var af, bf Point[float32]
2020
Add(af, bf)
21+
22+
var ai, bi Point[int]
23+
Add(ai, bi)
2124
}

compiler/testdata/generics.ll

Lines changed: 154 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ source_filename = "generics.go"
33
target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
44
target triple = "wasm32-unknown-wasi"
55

6-
%main.Point = type { float, float }
6+
%"main.Point[int]" = type { i32, i32 }
7+
%"main.Point[float32]" = type { float, float }
78

89
declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*) #0
910

@@ -18,73 +19,96 @@ entry:
1819
; Function Attrs: nounwind
1920
define hidden void @main.main(i8* %context) unnamed_addr #1 {
2021
entry:
21-
%bf = alloca %main.Point, align 8
22-
%af = alloca %main.Point, align 8
23-
%af.repack = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 0
22+
%bi = alloca %"main.Point[int]", align 8
23+
%ai = alloca %"main.Point[int]", align 8
24+
%bf = alloca %"main.Point[float32]", align 8
25+
%af = alloca %"main.Point[float32]", align 8
26+
%af.repack = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %af, i32 0, i32 0
2427
store float 0.000000e+00, float* %af.repack, align 8
25-
%af.repack1 = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 1
28+
%af.repack1 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %af, i32 0, i32 1
2629
store float 0.000000e+00, float* %af.repack1, align 4
27-
%0 = bitcast %main.Point* %af to i8*
30+
%0 = bitcast %"main.Point[float32]"* %af to i8*
2831
call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2
29-
%bf.repack = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 0
32+
%bf.repack = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %bf, i32 0, i32 0
3033
store float 0.000000e+00, float* %bf.repack, align 8
31-
%bf.repack2 = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 1
34+
%bf.repack2 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %bf, i32 0, i32 1
3235
store float 0.000000e+00, float* %bf.repack2, align 4
33-
%1 = bitcast %main.Point* %bf to i8*
36+
%1 = bitcast %"main.Point[float32]"* %bf to i8*
3437
call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2
35-
%.elt = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 0
38+
%.elt = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %af, i32 0, i32 0
3639
%.unpack = load float, float* %.elt, align 8
37-
%.elt3 = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 1
40+
%.elt3 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %af, i32 0, i32 1
3841
%.unpack4 = load float, float* %.elt3, align 4
39-
%.elt5 = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 0
42+
%.elt5 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %bf, i32 0, i32 0
4043
%.unpack6 = load float, float* %.elt5, align 8
41-
%.elt7 = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 1
44+
%.elt7 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %bf, i32 0, i32 1
4245
%.unpack8 = load float, float* %.elt7, align 4
43-
%2 = call %main.Point @"main.Add[float32]"(float %.unpack, float %.unpack4, float %.unpack6, float %.unpack8, i8* undef)
46+
%2 = call %"main.Point[float32]" @"main.Add[float32]"(float %.unpack, float %.unpack4, float %.unpack6, float %.unpack8, i8* undef)
47+
%ai.repack = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %ai, i32 0, i32 0
48+
store i32 0, i32* %ai.repack, align 8
49+
%ai.repack9 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %ai, i32 0, i32 1
50+
store i32 0, i32* %ai.repack9, align 4
51+
%3 = bitcast %"main.Point[int]"* %ai to i8*
52+
call void @runtime.trackPointer(i8* nonnull %3, i8* undef) #2
53+
%bi.repack = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %bi, i32 0, i32 0
54+
store i32 0, i32* %bi.repack, align 8
55+
%bi.repack10 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %bi, i32 0, i32 1
56+
store i32 0, i32* %bi.repack10, align 4
57+
%4 = bitcast %"main.Point[int]"* %bi to i8*
58+
call void @runtime.trackPointer(i8* nonnull %4, i8* undef) #2
59+
%.elt11 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %ai, i32 0, i32 0
60+
%.unpack12 = load i32, i32* %.elt11, align 8
61+
%.elt13 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %ai, i32 0, i32 1
62+
%.unpack14 = load i32, i32* %.elt13, align 4
63+
%.elt15 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %bi, i32 0, i32 0
64+
%.unpack16 = load i32, i32* %.elt15, align 8
65+
%.elt17 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %bi, i32 0, i32 1
66+
%.unpack18 = load i32, i32* %.elt17, align 4
67+
%5 = call %"main.Point[int]" @"main.Add[int]"(i32 %.unpack12, i32 %.unpack14, i32 %.unpack16, i32 %.unpack18, i8* undef)
4468
ret void
4569
}
4670

4771
; Function Attrs: nounwind
48-
define linkonce_odr hidden %main.Point @"main.Add[float32]"(float %a.X, float %a.Y, float %b.X, float %b.Y, i8* %context) unnamed_addr #1 {
72+
define linkonce_odr hidden %"main.Point[float32]" @"main.Add[float32]"(float %a.X, float %a.Y, float %b.X, float %b.Y, i8* %context) unnamed_addr #1 {
4973
entry:
50-
%complit = alloca %main.Point, align 8
51-
%b = alloca %main.Point, align 8
52-
%a = alloca %main.Point, align 8
53-
%a.repack = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 0
74+
%complit = alloca %"main.Point[float32]", align 8
75+
%b = alloca %"main.Point[float32]", align 8
76+
%a = alloca %"main.Point[float32]", align 8
77+
%a.repack = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %a, i32 0, i32 0
5478
store float 0.000000e+00, float* %a.repack, align 8
55-
%a.repack9 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 1
79+
%a.repack9 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %a, i32 0, i32 1
5680
store float 0.000000e+00, float* %a.repack9, align 4
57-
%0 = bitcast %main.Point* %a to i8*
81+
%0 = bitcast %"main.Point[float32]"* %a to i8*
5882
call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2
59-
%a.repack10 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 0
83+
%a.repack10 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %a, i32 0, i32 0
6084
store float %a.X, float* %a.repack10, align 8
61-
%a.repack11 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 1
85+
%a.repack11 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %a, i32 0, i32 1
6286
store float %a.Y, float* %a.repack11, align 4
63-
%b.repack = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 0
87+
%b.repack = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %b, i32 0, i32 0
6488
store float 0.000000e+00, float* %b.repack, align 8
65-
%b.repack13 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 1
89+
%b.repack13 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %b, i32 0, i32 1
6690
store float 0.000000e+00, float* %b.repack13, align 4
67-
%1 = bitcast %main.Point* %b to i8*
91+
%1 = bitcast %"main.Point[float32]"* %b to i8*
6892
call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2
69-
%b.repack14 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 0
93+
%b.repack14 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %b, i32 0, i32 0
7094
store float %b.X, float* %b.repack14, align 8
71-
%b.repack15 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 1
95+
%b.repack15 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %b, i32 0, i32 1
7296
store float %b.Y, float* %b.repack15, align 4
73-
%complit.repack = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 0
97+
%complit.repack = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %complit, i32 0, i32 0
7498
store float 0.000000e+00, float* %complit.repack, align 8
75-
%complit.repack17 = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 1
99+
%complit.repack17 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %complit, i32 0, i32 1
76100
store float 0.000000e+00, float* %complit.repack17, align 4
77-
%2 = bitcast %main.Point* %complit to i8*
101+
%2 = bitcast %"main.Point[float32]"* %complit to i8*
78102
call void @runtime.trackPointer(i8* nonnull %2, i8* undef) #2
79-
%3 = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 0
103+
%3 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %complit, i32 0, i32 0
80104
br i1 false, label %deref.throw, label %deref.next
81105

82106
deref.next: ; preds = %entry
83107
br i1 false, label %deref.throw1, label %deref.next2
84108

85109
deref.next2: ; preds = %deref.next
86-
%4 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 0
87-
%5 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 0
110+
%4 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %b, i32 0, i32 0
111+
%5 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %a, i32 0, i32 0
88112
%6 = load float, float* %5, align 8
89113
%7 = load float, float* %4, align 8
90114
%8 = fadd float %6, %7
@@ -94,8 +118,8 @@ deref.next4: ; preds = %deref.next2
94118
br i1 false, label %deref.throw5, label %deref.next6
95119

96120
deref.next6: ; preds = %deref.next4
97-
%9 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 1
98-
%10 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 1
121+
%9 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %b, i32 0, i32 1
122+
%10 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %a, i32 0, i32 1
99123
%11 = load float, float* %10, align 4
100124
%12 = load float, float* %9, align 4
101125
br i1 false, label %store.throw, label %store.next
@@ -105,14 +129,14 @@ store.next: ; preds = %deref.next6
105129
br i1 false, label %store.throw7, label %store.next8
106130

107131
store.next8: ; preds = %store.next
108-
%13 = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 1
132+
%13 = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %complit, i32 0, i32 1
109133
%14 = fadd float %11, %12
110134
store float %14, float* %13, align 4
111-
%.elt = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 0
135+
%.elt = getelementptr inbounds %"main.Point[float32]", %"main.Point[float32]"* %complit, i32 0, i32 0
112136
%.unpack = load float, float* %.elt, align 8
113-
%15 = insertvalue %main.Point undef, float %.unpack, 0
114-
%16 = insertvalue %main.Point %15, float %14, 1
115-
ret %main.Point %16
137+
%15 = insertvalue %"main.Point[float32]" undef, float %.unpack, 0
138+
%16 = insertvalue %"main.Point[float32]" %15, float %14, 1
139+
ret %"main.Point[float32]" %16
116140

117141
deref.throw: ; preds = %entry
118142
unreachable
@@ -135,6 +159,95 @@ store.throw7: ; preds = %store.next
135159

136160
declare void @runtime.nilPanic(i8*) #0
137161

162+
; Function Attrs: nounwind
163+
define linkonce_odr hidden %"main.Point[int]" @"main.Add[int]"(i32 %a.X, i32 %a.Y, i32 %b.X, i32 %b.Y, i8* %context) unnamed_addr #1 {
164+
entry:
165+
%complit = alloca %"main.Point[int]", align 8
166+
%b = alloca %"main.Point[int]", align 8
167+
%a = alloca %"main.Point[int]", align 8
168+
%a.repack = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %a, i32 0, i32 0
169+
store i32 0, i32* %a.repack, align 8
170+
%a.repack9 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %a, i32 0, i32 1
171+
store i32 0, i32* %a.repack9, align 4
172+
%0 = bitcast %"main.Point[int]"* %a to i8*
173+
call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2
174+
%a.repack10 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %a, i32 0, i32 0
175+
store i32 %a.X, i32* %a.repack10, align 8
176+
%a.repack11 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %a, i32 0, i32 1
177+
store i32 %a.Y, i32* %a.repack11, align 4
178+
%b.repack = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %b, i32 0, i32 0
179+
store i32 0, i32* %b.repack, align 8
180+
%b.repack13 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %b, i32 0, i32 1
181+
store i32 0, i32* %b.repack13, align 4
182+
%1 = bitcast %"main.Point[int]"* %b to i8*
183+
call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2
184+
%b.repack14 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %b, i32 0, i32 0
185+
store i32 %b.X, i32* %b.repack14, align 8
186+
%b.repack15 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %b, i32 0, i32 1
187+
store i32 %b.Y, i32* %b.repack15, align 4
188+
%complit.repack = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %complit, i32 0, i32 0
189+
store i32 0, i32* %complit.repack, align 8
190+
%complit.repack17 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %complit, i32 0, i32 1
191+
store i32 0, i32* %complit.repack17, align 4
192+
%2 = bitcast %"main.Point[int]"* %complit to i8*
193+
call void @runtime.trackPointer(i8* nonnull %2, i8* undef) #2
194+
%3 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %complit, i32 0, i32 0
195+
br i1 false, label %deref.throw, label %deref.next
196+
197+
deref.next: ; preds = %entry
198+
br i1 false, label %deref.throw1, label %deref.next2
199+
200+
deref.next2: ; preds = %deref.next
201+
%4 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %b, i32 0, i32 0
202+
%5 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %a, i32 0, i32 0
203+
%6 = load i32, i32* %5, align 8
204+
%7 = load i32, i32* %4, align 8
205+
%8 = add i32 %6, %7
206+
br i1 false, label %deref.throw3, label %deref.next4
207+
208+
deref.next4: ; preds = %deref.next2
209+
br i1 false, label %deref.throw5, label %deref.next6
210+
211+
deref.next6: ; preds = %deref.next4
212+
%9 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %b, i32 0, i32 1
213+
%10 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %a, i32 0, i32 1
214+
%11 = load i32, i32* %10, align 4
215+
%12 = load i32, i32* %9, align 4
216+
br i1 false, label %store.throw, label %store.next
217+
218+
store.next: ; preds = %deref.next6
219+
store i32 %8, i32* %3, align 8
220+
br i1 false, label %store.throw7, label %store.next8
221+
222+
store.next8: ; preds = %store.next
223+
%13 = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %complit, i32 0, i32 1
224+
%14 = add i32 %11, %12
225+
store i32 %14, i32* %13, align 4
226+
%.elt = getelementptr inbounds %"main.Point[int]", %"main.Point[int]"* %complit, i32 0, i32 0
227+
%.unpack = load i32, i32* %.elt, align 8
228+
%15 = insertvalue %"main.Point[int]" undef, i32 %.unpack, 0
229+
%16 = insertvalue %"main.Point[int]" %15, i32 %14, 1
230+
ret %"main.Point[int]" %16
231+
232+
deref.throw: ; preds = %entry
233+
unreachable
234+
235+
deref.throw1: ; preds = %deref.next
236+
unreachable
237+
238+
deref.throw3: ; preds = %deref.next2
239+
unreachable
240+
241+
deref.throw5: ; preds = %deref.next4
242+
unreachable
243+
244+
store.throw: ; preds = %deref.next6
245+
unreachable
246+
247+
store.throw7: ; preds = %store.next
248+
unreachable
249+
}
250+
138251
attributes #0 = { "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
139252
attributes #1 = { nounwind "target-features"="+bulk-memory,+nontrapping-fptoint,+sign-ext" }
140253
attributes #2 = { nounwind }

0 commit comments

Comments
 (0)