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++ {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче