Store LLVM reference instead of function name in Frame
Этот коммит содержится в:
		
							родитель
							
								
									45e7376f39
								
							
						
					
					
						коммит
						12eb9eec3c
					
				
					 1 изменённых файлов: 8 добавлений и 6 удалений
				
			
		
							
								
								
									
										14
									
								
								tgo.go
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								tgo.go
									
										
									
									
									
								
							|  | @ -54,7 +54,7 @@ type Compiler struct { | ||||||
| 
 | 
 | ||||||
| type Frame struct { | type Frame struct { | ||||||
| 	pkgPrefix string | 	pkgPrefix string | ||||||
| 	name      string                   // full name, including package | 	llvmFn    llvm.Value | ||||||
| 	params    map[*ssa.Parameter]int   // arguments to the function | 	params    map[*ssa.Parameter]int   // arguments to the function | ||||||
| 	locals    map[ssa.Value]llvm.Value // local variables | 	locals    map[ssa.Value]llvm.Value // local variables | ||||||
| 	blocks    map[*ssa.BasicBlock]llvm.BasicBlock | 	blocks    map[*ssa.BasicBlock]llvm.BasicBlock | ||||||
|  | @ -336,7 +336,6 @@ func (c *Compiler) parseFuncDecl(pkgPrefix string, f *ssa.Function) (*Frame, err | ||||||
| 
 | 
 | ||||||
| 	frame := &Frame{ | 	frame := &Frame{ | ||||||
| 		pkgPrefix: pkgPrefix, | 		pkgPrefix: pkgPrefix, | ||||||
| 		name:      name, |  | ||||||
| 		params:    make(map[*ssa.Parameter]int), | 		params:    make(map[*ssa.Parameter]int), | ||||||
| 		locals:    make(map[ssa.Value]llvm.Value), | 		locals:    make(map[ssa.Value]llvm.Value), | ||||||
| 		blocks:    make(map[*ssa.BasicBlock]llvm.BasicBlock), | 		blocks:    make(map[*ssa.BasicBlock]llvm.BasicBlock), | ||||||
|  | @ -366,21 +365,24 @@ func (c *Compiler) parseFuncDecl(pkgPrefix string, f *ssa.Function) (*Frame, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	fnType := llvm.FunctionType(retType, paramTypes, false) | 	fnType := llvm.FunctionType(retType, paramTypes, false) | ||||||
| 	llvm.AddFunction(c.mod, name, fnType) | 
 | ||||||
|  | 	frame.llvmFn = c.mod.NamedFunction(name) | ||||||
|  | 	if frame.llvmFn.IsNil() { | ||||||
|  | 		frame.llvmFn = llvm.AddFunction(c.mod, name, fnType) | ||||||
|  | 	} | ||||||
| 	return frame, nil | 	return frame, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error { | func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error { | ||||||
| 	// Pre-create all basic blocks in the function. | 	// Pre-create all basic blocks in the function. | ||||||
| 	llvmFn := c.mod.NamedFunction(frame.name) |  | ||||||
| 	for _, block := range f.DomPreorder() { | 	for _, block := range f.DomPreorder() { | ||||||
| 		llvmBlock := c.ctx.AddBasicBlock(llvmFn, block.Comment) | 		llvmBlock := c.ctx.AddBasicBlock(frame.llvmFn, block.Comment) | ||||||
| 		frame.blocks[block] = llvmBlock | 		frame.blocks[block] = llvmBlock | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Load function parameters | 	// Load function parameters | ||||||
| 	for _, param := range f.Params { | 	for _, param := range f.Params { | ||||||
| 		llvmParam := llvmFn.Param(frame.params[param]) | 		llvmParam := frame.llvmFn.Param(frame.params[param]) | ||||||
| 		frame.locals[param] = llvmParam | 		frame.locals[param] = llvmParam | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem