summaryrefslogtreecommitdiffstats
path: root/llgo/irgen/compiler.go
diff options
context:
space:
mode:
Diffstat (limited to 'llgo/irgen/compiler.go')
-rw-r--r--llgo/irgen/compiler.go23
1 files changed, 20 insertions, 3 deletions
diff --git a/llgo/irgen/compiler.go b/llgo/irgen/compiler.go
index 60bd62f7196..16c3988ba7b 100644
--- a/llgo/irgen/compiler.go
+++ b/llgo/irgen/compiler.go
@@ -75,6 +75,9 @@ type CompilerOptions struct {
// path in ImportPaths.
GccgoPath string
+ // Whether to use the gccgo ABI.
+ GccgoABI bool
+
// ImportPaths is the list of additional import paths
ImportPaths []string
@@ -322,8 +325,6 @@ func (c *compiler) buildPackageInitData(mainPkg *ssa.Package) gccgoimporter.Init
}
func (c *compiler) createInitMainFunction(mainPkg *ssa.Package) {
- initdata := c.buildPackageInitData(mainPkg)
-
ftyp := llvm.FunctionType(llvm.VoidType(), nil, false)
initMain := llvm.AddFunction(c.module.Module, "__go_init_main", ftyp)
c.addCommonFunctionAttrs(initMain)
@@ -333,6 +334,17 @@ func (c *compiler) createInitMainFunction(mainPkg *ssa.Package) {
defer builder.Dispose()
builder.SetInsertPointAtEnd(entry)
+ if !c.GccgoABI {
+ initfn := c.module.Module.NamedFunction("main..import")
+ if !initfn.IsNil() {
+ builder.CreateCall(initfn, nil, "")
+ }
+ builder.CreateRetVoid()
+ return
+ }
+
+ initdata := c.buildPackageInitData(mainPkg)
+
for _, init := range initdata.Inits {
initfn := c.module.Module.NamedFunction(init.InitFunc)
if initfn.IsNil() {
@@ -348,8 +360,13 @@ func (c *compiler) buildExportData(mainPkg *ssa.Package) []byte {
exportData := importer.ExportData(mainPkg.Object)
b := bytes.NewBuffer(exportData)
+ b.WriteString("v1;\n")
+ if !c.GccgoABI {
+ return b.Bytes()
+ }
+
initdata := c.buildPackageInitData(mainPkg)
- b.WriteString("v1;\npriority ")
+ b.WriteString("priority ")
b.WriteString(strconv.Itoa(initdata.Priority))
b.WriteString(";\n")
OpenPOWER on IntegriCloud