compiler: do not try to build generic functions
There is no reason to: we should only build instantiated generic functions.
Этот коммит содержится в:
		
							родитель
							
								
									408855da14
								
							
						
					
					
						коммит
						5078ce382d
					
				
					 2 изменённых файлов: 45 добавлений и 45 удалений
				
			
		|  | @ -786,6 +786,10 @@ func (c *compilerContext) createPackage(irbuilder llvm.Builder, pkg *ssa.Package | ||||||
| 		member := pkg.Members[name] | 		member := pkg.Members[name] | ||||||
| 		switch member := member.(type) { | 		switch member := member.(type) { | ||||||
| 		case *ssa.Function: | 		case *ssa.Function: | ||||||
|  | 			if member.Synthetic == "generic function" { | ||||||
|  | 				// Do not try to build generic (non-instantiated) functions. | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
| 			// Create the function definition. | 			// Create the function definition. | ||||||
| 			b := newBuilder(c, irbuilder, member) | 			b := newBuilder(c, irbuilder, member) | ||||||
| 			if member.Blocks == nil { | 			if member.Blocks == nil { | ||||||
|  |  | ||||||
							
								
								
									
										86
									
								
								compiler/testdata/generics.ll
									
										
									
									
										предоставленный
									
									
								
							
							
						
						
									
										86
									
								
								compiler/testdata/generics.ll
									
										
									
									
										предоставленный
									
									
								
							|  | @ -3,9 +3,7 @@ source_filename = "generics.go" | ||||||
| target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20" | target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20" | ||||||
| target triple = "wasm32-unknown-wasi" | target triple = "wasm32-unknown-wasi" | ||||||
| 
 | 
 | ||||||
| %main.Point = type { %runtime._interface, %runtime._interface } | %main.Point = type { float, float } | ||||||
| %runtime._interface = type { i32, i8* } |  | ||||||
| %main.Point.0 = type { float, float } |  | ||||||
| 
 | 
 | ||||||
| declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*) #0 | declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*) #0 | ||||||
| 
 | 
 | ||||||
|  | @ -17,78 +15,76 @@ entry: | ||||||
|   ret void |   ret void | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| declare %main.Point @main.Add(%main.Point, %main.Point, i8*) #0 |  | ||||||
| 
 |  | ||||||
| ; Function Attrs: nounwind | ; Function Attrs: nounwind | ||||||
| define hidden void @main.main(i8* %context) unnamed_addr #1 { | define hidden void @main.main(i8* %context) unnamed_addr #1 { | ||||||
| entry: | entry: | ||||||
|   %bf = alloca %main.Point.0, align 8 |   %bf = alloca %main.Point, align 8 | ||||||
|   %af = alloca %main.Point.0, align 8 |   %af = alloca %main.Point, align 8 | ||||||
|   %af.repack = getelementptr inbounds %main.Point.0, %main.Point.0* %af, i32 0, i32 0 |   %af.repack = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 0 | ||||||
|   store float 0.000000e+00, float* %af.repack, align 8 |   store float 0.000000e+00, float* %af.repack, align 8 | ||||||
|   %af.repack1 = getelementptr inbounds %main.Point.0, %main.Point.0* %af, i32 0, i32 1 |   %af.repack1 = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 1 | ||||||
|   store float 0.000000e+00, float* %af.repack1, align 4 |   store float 0.000000e+00, float* %af.repack1, align 4 | ||||||
|   %0 = bitcast %main.Point.0* %af to i8* |   %0 = bitcast %main.Point* %af to i8* | ||||||
|   call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2 |   call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2 | ||||||
|   %bf.repack = getelementptr inbounds %main.Point.0, %main.Point.0* %bf, i32 0, i32 0 |   %bf.repack = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 0 | ||||||
|   store float 0.000000e+00, float* %bf.repack, align 8 |   store float 0.000000e+00, float* %bf.repack, align 8 | ||||||
|   %bf.repack2 = getelementptr inbounds %main.Point.0, %main.Point.0* %bf, i32 0, i32 1 |   %bf.repack2 = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 1 | ||||||
|   store float 0.000000e+00, float* %bf.repack2, align 4 |   store float 0.000000e+00, float* %bf.repack2, align 4 | ||||||
|   %1 = bitcast %main.Point.0* %bf to i8* |   %1 = bitcast %main.Point* %bf to i8* | ||||||
|   call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2 |   call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2 | ||||||
|   %.elt = getelementptr inbounds %main.Point.0, %main.Point.0* %af, i32 0, i32 0 |   %.elt = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 0 | ||||||
|   %.unpack = load float, float* %.elt, align 8 |   %.unpack = load float, float* %.elt, align 8 | ||||||
|   %.elt3 = getelementptr inbounds %main.Point.0, %main.Point.0* %af, i32 0, i32 1 |   %.elt3 = getelementptr inbounds %main.Point, %main.Point* %af, i32 0, i32 1 | ||||||
|   %.unpack4 = load float, float* %.elt3, align 4 |   %.unpack4 = load float, float* %.elt3, align 4 | ||||||
|   %.elt5 = getelementptr inbounds %main.Point.0, %main.Point.0* %bf, i32 0, i32 0 |   %.elt5 = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 0 | ||||||
|   %.unpack6 = load float, float* %.elt5, align 8 |   %.unpack6 = load float, float* %.elt5, align 8 | ||||||
|   %.elt7 = getelementptr inbounds %main.Point.0, %main.Point.0* %bf, i32 0, i32 1 |   %.elt7 = getelementptr inbounds %main.Point, %main.Point* %bf, i32 0, i32 1 | ||||||
|   %.unpack8 = load float, float* %.elt7, align 4 |   %.unpack8 = load float, float* %.elt7, align 4 | ||||||
|   %2 = call %main.Point.0 @"main.Add[float32]"(float %.unpack, float %.unpack4, float %.unpack6, float %.unpack8, i8* undef) |   %2 = call %main.Point @"main.Add[float32]"(float %.unpack, float %.unpack4, float %.unpack6, float %.unpack8, i8* undef) | ||||||
|   ret void |   ret void | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ; Function Attrs: nounwind | ; Function Attrs: nounwind | ||||||
| define linkonce_odr hidden %main.Point.0 @"main.Add[float32]"(float %a.X, float %a.Y, float %b.X, float %b.Y, i8* %context) unnamed_addr #1 { | 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 { | ||||||
| entry: | entry: | ||||||
|   %complit = alloca %main.Point.0, align 8 |   %complit = alloca %main.Point, align 8 | ||||||
|   %b = alloca %main.Point.0, align 8 |   %b = alloca %main.Point, align 8 | ||||||
|   %a = alloca %main.Point.0, align 8 |   %a = alloca %main.Point, align 8 | ||||||
|   %a.repack = getelementptr inbounds %main.Point.0, %main.Point.0* %a, i32 0, i32 0 |   %a.repack = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 0 | ||||||
|   store float 0.000000e+00, float* %a.repack, align 8 |   store float 0.000000e+00, float* %a.repack, align 8 | ||||||
|   %a.repack9 = getelementptr inbounds %main.Point.0, %main.Point.0* %a, i32 0, i32 1 |   %a.repack9 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 1 | ||||||
|   store float 0.000000e+00, float* %a.repack9, align 4 |   store float 0.000000e+00, float* %a.repack9, align 4 | ||||||
|   %0 = bitcast %main.Point.0* %a to i8* |   %0 = bitcast %main.Point* %a to i8* | ||||||
|   call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2 |   call void @runtime.trackPointer(i8* nonnull %0, i8* undef) #2 | ||||||
|   %a.repack10 = getelementptr inbounds %main.Point.0, %main.Point.0* %a, i32 0, i32 0 |   %a.repack10 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 0 | ||||||
|   store float %a.X, float* %a.repack10, align 8 |   store float %a.X, float* %a.repack10, align 8 | ||||||
|   %a.repack11 = getelementptr inbounds %main.Point.0, %main.Point.0* %a, i32 0, i32 1 |   %a.repack11 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 1 | ||||||
|   store float %a.Y, float* %a.repack11, align 4 |   store float %a.Y, float* %a.repack11, align 4 | ||||||
|   %b.repack = getelementptr inbounds %main.Point.0, %main.Point.0* %b, i32 0, i32 0 |   %b.repack = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 0 | ||||||
|   store float 0.000000e+00, float* %b.repack, align 8 |   store float 0.000000e+00, float* %b.repack, align 8 | ||||||
|   %b.repack13 = getelementptr inbounds %main.Point.0, %main.Point.0* %b, i32 0, i32 1 |   %b.repack13 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 1 | ||||||
|   store float 0.000000e+00, float* %b.repack13, align 4 |   store float 0.000000e+00, float* %b.repack13, align 4 | ||||||
|   %1 = bitcast %main.Point.0* %b to i8* |   %1 = bitcast %main.Point* %b to i8* | ||||||
|   call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2 |   call void @runtime.trackPointer(i8* nonnull %1, i8* undef) #2 | ||||||
|   %b.repack14 = getelementptr inbounds %main.Point.0, %main.Point.0* %b, i32 0, i32 0 |   %b.repack14 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 0 | ||||||
|   store float %b.X, float* %b.repack14, align 8 |   store float %b.X, float* %b.repack14, align 8 | ||||||
|   %b.repack15 = getelementptr inbounds %main.Point.0, %main.Point.0* %b, i32 0, i32 1 |   %b.repack15 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 1 | ||||||
|   store float %b.Y, float* %b.repack15, align 4 |   store float %b.Y, float* %b.repack15, align 4 | ||||||
|   %complit.repack = getelementptr inbounds %main.Point.0, %main.Point.0* %complit, i32 0, i32 0 |   %complit.repack = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 0 | ||||||
|   store float 0.000000e+00, float* %complit.repack, align 8 |   store float 0.000000e+00, float* %complit.repack, align 8 | ||||||
|   %complit.repack17 = getelementptr inbounds %main.Point.0, %main.Point.0* %complit, i32 0, i32 1 |   %complit.repack17 = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 1 | ||||||
|   store float 0.000000e+00, float* %complit.repack17, align 4 |   store float 0.000000e+00, float* %complit.repack17, align 4 | ||||||
|   %2 = bitcast %main.Point.0* %complit to i8* |   %2 = bitcast %main.Point* %complit to i8* | ||||||
|   call void @runtime.trackPointer(i8* nonnull %2, i8* undef) #2 |   call void @runtime.trackPointer(i8* nonnull %2, i8* undef) #2 | ||||||
|   %3 = getelementptr inbounds %main.Point.0, %main.Point.0* %complit, i32 0, i32 0 |   %3 = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 0 | ||||||
|   br i1 false, label %deref.throw, label %deref.next |   br i1 false, label %deref.throw, label %deref.next | ||||||
| 
 | 
 | ||||||
| deref.next:                                       ; preds = %entry | deref.next:                                       ; preds = %entry | ||||||
|   br i1 false, label %deref.throw1, label %deref.next2 |   br i1 false, label %deref.throw1, label %deref.next2 | ||||||
| 
 | 
 | ||||||
| deref.next2:                                      ; preds = %deref.next | deref.next2:                                      ; preds = %deref.next | ||||||
|   %4 = getelementptr inbounds %main.Point.0, %main.Point.0* %b, i32 0, i32 0 |   %4 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 0 | ||||||
|   %5 = getelementptr inbounds %main.Point.0, %main.Point.0* %a, i32 0, i32 0 |   %5 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 0 | ||||||
|   %6 = load float, float* %5, align 8 |   %6 = load float, float* %5, align 8 | ||||||
|   %7 = load float, float* %4, align 8 |   %7 = load float, float* %4, align 8 | ||||||
|   %8 = fadd float %6, %7 |   %8 = fadd float %6, %7 | ||||||
|  | @ -98,8 +94,8 @@ deref.next4:                                      ; preds = %deref.next2 | ||||||
|   br i1 false, label %deref.throw5, label %deref.next6 |   br i1 false, label %deref.throw5, label %deref.next6 | ||||||
| 
 | 
 | ||||||
| deref.next6:                                      ; preds = %deref.next4 | deref.next6:                                      ; preds = %deref.next4 | ||||||
|   %9 = getelementptr inbounds %main.Point.0, %main.Point.0* %b, i32 0, i32 1 |   %9 = getelementptr inbounds %main.Point, %main.Point* %b, i32 0, i32 1 | ||||||
|   %10 = getelementptr inbounds %main.Point.0, %main.Point.0* %a, i32 0, i32 1 |   %10 = getelementptr inbounds %main.Point, %main.Point* %a, i32 0, i32 1 | ||||||
|   %11 = load float, float* %10, align 4 |   %11 = load float, float* %10, align 4 | ||||||
|   %12 = load float, float* %9, align 4 |   %12 = load float, float* %9, align 4 | ||||||
|   br i1 false, label %store.throw, label %store.next |   br i1 false, label %store.throw, label %store.next | ||||||
|  | @ -109,14 +105,14 @@ store.next:                                       ; preds = %deref.next6 | ||||||
|   br i1 false, label %store.throw7, label %store.next8 |   br i1 false, label %store.throw7, label %store.next8 | ||||||
| 
 | 
 | ||||||
| store.next8:                                      ; preds = %store.next | store.next8:                                      ; preds = %store.next | ||||||
|   %13 = getelementptr inbounds %main.Point.0, %main.Point.0* %complit, i32 0, i32 1 |   %13 = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 1 | ||||||
|   %14 = fadd float %11, %12 |   %14 = fadd float %11, %12 | ||||||
|   store float %14, float* %13, align 4 |   store float %14, float* %13, align 4 | ||||||
|   %.elt = getelementptr inbounds %main.Point.0, %main.Point.0* %complit, i32 0, i32 0 |   %.elt = getelementptr inbounds %main.Point, %main.Point* %complit, i32 0, i32 0 | ||||||
|   %.unpack = load float, float* %.elt, align 8 |   %.unpack = load float, float* %.elt, align 8 | ||||||
|   %15 = insertvalue %main.Point.0 undef, float %.unpack, 0 |   %15 = insertvalue %main.Point undef, float %.unpack, 0 | ||||||
|   %16 = insertvalue %main.Point.0 %15, float %14, 1 |   %16 = insertvalue %main.Point %15, float %14, 1 | ||||||
|   ret %main.Point.0 %16 |   ret %main.Point %16 | ||||||
| 
 | 
 | ||||||
| deref.throw:                                      ; preds = %entry | deref.throw:                                      ; preds = %entry | ||||||
|   unreachable |   unreachable | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem