compiler: Fix globals so they actually work
Этот коммит содержится в:
		
							родитель
							
								
									14cbc1555d
								
							
						
					
					
						коммит
						c5a82bb916
					
				
					 1 изменённых файлов: 13 добавлений и 5 удалений
				
			
		
							
								
								
									
										18
									
								
								tgo.go
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								tgo.go
									
										
									
									
									
								
							|  | @ -5,7 +5,6 @@ import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"flag" | 	"flag" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"go/ast" |  | ||||||
| 	"go/build" | 	"go/build" | ||||||
| 	"go/constant" | 	"go/constant" | ||||||
| 	"go/token" | 	"go/token" | ||||||
|  | @ -377,14 +376,23 @@ func (c *Compiler) parsePackage(program *ssa.Program, pkg *ssa.Package) error { | ||||||
| 			// Ignore package-level untyped constants. The SSA form doesn't need | 			// Ignore package-level untyped constants. The SSA form doesn't need | ||||||
| 			// them. | 			// them. | ||||||
| 		case *ssa.Global: | 		case *ssa.Global: | ||||||
| 			typ, err := c.getLLVMType(member.Type()) | 			typ := member.Type() | ||||||
|  | 			if typPtr, ok := typ.(*types.Pointer); ok { | ||||||
|  | 				typ = typPtr.Elem() | ||||||
|  | 			} else { | ||||||
|  | 				return errors.New("global is not a pointer") | ||||||
|  | 			} | ||||||
|  | 			llvmType, err := c.getLLVMType(typ) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 			global := llvm.AddGlobal(c.mod, typ, pkgPrefix(member.Pkg) + "." +  member.Name()) | 			global := llvm.AddGlobal(c.mod, llvmType, pkgPrefix(member.Pkg) + "." +  member.Name()) | ||||||
| 			if ast.IsExported(member.Name()) { | 			global.SetLinkage(llvm.PrivateLinkage) | ||||||
| 				global.SetLinkage(llvm.PrivateLinkage) | 			initializer, err := c.getZeroValue(llvmType) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
| 			} | 			} | ||||||
|  | 			global.SetInitializer(initializer) | ||||||
| 		case *ssa.Type: | 		case *ssa.Type: | ||||||
| 			ms := program.MethodSets.MethodSet(member.Type()) | 			ms := program.MethodSets.MethodSet(member.Type()) | ||||||
| 			for i := 0; i < ms.Len(); i++ { | 			for i := 0; i < ms.Len(); i++ { | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem