compiler: Fix globals so they actually work

Этот коммит содержится в:
Ayke van Laethem 2018-04-29 00:49:33 +02:00
родитель 14cbc1555d
коммит c5a82bb916

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++ {