mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-21 12:59:04 +00:00
compiler: Fix globals so they actually work
This commit is contained in:
@@ -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++ {
|
||||||
|
|||||||
Reference in New Issue
Block a user