From c5a82bb916ca298c7407172a28910c8a6e25acfb Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sun, 29 Apr 2018 00:49:33 +0200 Subject: [PATCH] compiler: Fix globals so they actually work --- tgo.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tgo.go b/tgo.go index 568d0a4f..6a5b617f 100644 --- a/tgo.go +++ b/tgo.go @@ -5,7 +5,6 @@ import ( "errors" "flag" "fmt" - "go/ast" "go/build" "go/constant" "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 // them. 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 { return err } - global := llvm.AddGlobal(c.mod, typ, pkgPrefix(member.Pkg) + "." + member.Name()) - if ast.IsExported(member.Name()) { - global.SetLinkage(llvm.PrivateLinkage) + global := llvm.AddGlobal(c.mod, llvmType, pkgPrefix(member.Pkg) + "." + member.Name()) + global.SetLinkage(llvm.PrivateLinkage) + initializer, err := c.getZeroValue(llvmType) + if err != nil { + return err } + global.SetInitializer(initializer) case *ssa.Type: ms := program.MethodSets.MethodSet(member.Type()) for i := 0; i < ms.Len(); i++ {