compiler: create runtime types lazily when needed
This fixes a longstanding TODO comment and similar to https://github.com/tinygo-org/tinygo/pull/1593 it removes some code out of the compiler.CompileProgram function that doesn't need to be there.
Этот коммит содержится в:
		
							родитель
							
								
									0bad2c9ff2
								
							
						
					
					
						коммит
						5bae55d755
					
				
					 1 изменённых файлов: 4 добавлений и 21 удалений
				
			
		| 
						 | 
				
			
			@ -52,6 +52,7 @@ type compilerContext struct {
 | 
			
		|||
	program          *ssa.Program
 | 
			
		||||
	diagnostics      []error
 | 
			
		||||
	astComments      map[string]*ast.CommentGroup
 | 
			
		||||
	runtimePkg       *types.Package
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// newCompilerContext returns a new compiler context ready for use, most
 | 
			
		||||
| 
						 | 
				
			
			@ -222,6 +223,7 @@ func CompileProgram(pkgName string, lprogram *loader.Program, machine llvm.Targe
 | 
			
		|||
 | 
			
		||||
	c.program = lprogram.LoadSSA()
 | 
			
		||||
	c.program.Build()
 | 
			
		||||
	c.runtimePkg = c.program.ImportedPackage("runtime").Pkg
 | 
			
		||||
 | 
			
		||||
	// Run a simple dead code elimination pass.
 | 
			
		||||
	functions, err := c.simpleDCE(lprogram)
 | 
			
		||||
| 
						 | 
				
			
			@ -242,20 +244,6 @@ func CompileProgram(pkgName string, lprogram *loader.Program, machine llvm.Targe
 | 
			
		|||
 | 
			
		||||
	c.loadASTComments(lprogram)
 | 
			
		||||
 | 
			
		||||
	// Declare runtime types.
 | 
			
		||||
	// TODO: lazily create runtime types in getLLVMRuntimeType when they are
 | 
			
		||||
	// needed. Eventually this will be required anyway, when packages are
 | 
			
		||||
	// compiled independently (and the runtime types are not available).
 | 
			
		||||
	for _, member := range c.program.ImportedPackage("runtime").Members {
 | 
			
		||||
		if member, ok := member.(*ssa.Type); ok {
 | 
			
		||||
			if typ, ok := member.Type().(*types.Named); ok {
 | 
			
		||||
				if _, ok := typ.Underlying().(*types.Struct); ok {
 | 
			
		||||
					c.getLLVMType(typ)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Predeclare the runtime.alloc function, which is used by the wordpack
 | 
			
		||||
	// functionality.
 | 
			
		||||
	c.getFunction(c.program.ImportedPackage("runtime").Members["alloc"].(*ssa.Function))
 | 
			
		||||
| 
						 | 
				
			
			@ -367,13 +355,8 @@ func CompilePackage(moduleName string, pkg *loader.Package, machine llvm.TargetM
 | 
			
		|||
// it as a LLVM type, creating it if necessary. It is a shorthand for
 | 
			
		||||
// getLLVMType(getRuntimeType(name)).
 | 
			
		||||
func (c *compilerContext) getLLVMRuntimeType(name string) llvm.Type {
 | 
			
		||||
	fullName := "runtime." + name
 | 
			
		||||
	typ := c.mod.GetTypeByName(fullName)
 | 
			
		||||
	if typ.IsNil() {
 | 
			
		||||
		println(c.mod.String())
 | 
			
		||||
		panic("could not find runtime type: " + fullName)
 | 
			
		||||
	}
 | 
			
		||||
	return typ
 | 
			
		||||
	typ := c.runtimePkg.Scope().Lookup(name).(*types.TypeName).Type()
 | 
			
		||||
	return c.getLLVMType(typ)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getLLVMType creates and returns a LLVM type for a Go type. In the case of
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче