Skip to content

Instantly share code, notes, and snippets.

@mewmew
Created November 9, 2018 03:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mewmew/d127b562fdd8f560222b4ded739861a7 to your computer and use it in GitHub Desktop.
Save mewmew/d127b562fdd8f560222b4ded739861a7 to your computer and use it in GitHub Desktop.
Diff against llir/llvm@3011396
diff --git a/asm/global.go b/asm/global.go
index 5a1f04c..fc73db6 100644
--- a/asm/global.go
+++ b/asm/global.go
@@ -2,6 +2,7 @@ package asm
import (
"fmt"
+ "sync"
"github.com/llir/ll/ast"
asmenum "github.com/llir/llvm/asm/enum"
@@ -120,6 +121,7 @@ func (gen *generator) newGlobal(name string, old ast.LlvmNode) (constant.Constan
func (gen *generator) translateGlobals() error {
// TODO: make concurrent and benchmark. Each gen.translateGlobalDecl,
// gen.translateGlobalDef, etc can be run in a Go-routine.
+ wg := &sync.WaitGroup{}
for name, old := range gen.old.globals {
v, ok := gen.new.globals[name]
if !ok {
@@ -139,9 +141,14 @@ func (gen *generator) translateGlobals() error {
if !ok {
panic(fmt.Errorf("invalid global definition type; expected *ir.Global, got %T", v))
}
- if err := gen.translateGlobalDef(new, old); err != nil {
- return errors.WithStack(err)
- }
+ wg.Add(1)
+ go func() error {
+ if err := gen.translateGlobalDef(new, old); err != nil {
+ return errors.WithStack(err)
+ }
+ wg.Done()
+ return nil
+ }()
case *ast.AliasDef:
new, ok := v.(*ir.Alias)
if !ok {
@@ -171,13 +178,19 @@ func (gen *generator) translateGlobals() error {
if !ok {
panic(fmt.Errorf("invalid function definition type; expected *ir.Function, got %T", v))
}
- if err := gen.translateFuncDef(new, old); err != nil {
- return errors.WithStack(err)
- }
+ wg.Add(1)
+ go func() error {
+ if err := gen.translateFuncDef(new, old); err != nil {
+ return errors.WithStack(err)
+ }
+ wg.Done()
+ return nil
+ }()
default:
panic(fmt.Errorf("support for global variable, indirect symbol or function %T not yet implemented", old))
}
}
+ wg.Wait()
return nil
}
diff --git a/asm/module.go b/asm/module.go
index 9599aeb..9f03593 100644
--- a/asm/module.go
+++ b/asm/module.go
@@ -2,6 +2,7 @@ package asm
import (
"fmt"
+ "sync"
"github.com/llir/ll/ast"
asmenum "github.com/llir/llvm/asm/enum"
@@ -205,21 +206,43 @@ func (gen *generator) translateTopLevelEntities() error {
// 1. Translate AST global declarations and definitions, alias and IFunc
// definitions, and function declarations and definitions to IR.
- if err := gen.translateGlobals(); err != nil {
- return errors.WithStack(err)
- }
+ wg := &sync.WaitGroup{}
+ wg.Add(1)
+ go func() error {
+ if err := gen.translateGlobals(); err != nil {
+ return errors.WithStack(err)
+ }
+ wg.Done()
+ return nil
+ }()
// 2. Translate AST attribute group definitions to IR.
- if err := gen.translateAttrGroupDefs(); err != nil {
- return errors.WithStack(err)
- }
+ wg.Add(1)
+ go func() error {
+ if err := gen.translateAttrGroupDefs(); err != nil {
+ return errors.WithStack(err)
+ }
+ wg.Done()
+ return nil
+ }()
// 3. Translate AST named metadata definitions to IR.
- if err := gen.translateNamedMetadataDefs(); err != nil {
- return errors.WithStack(err)
- }
+ wg.Add(1)
+ go func() error {
+ if err := gen.translateNamedMetadataDefs(); err != nil {
+ return errors.WithStack(err)
+ }
+ wg.Done()
+ return nil
+ }()
// 4. Translate AST metadata definitions to IR.
- if err := gen.translateMetadataDefs(); err != nil {
- return errors.WithStack(err)
- }
+ wg.Add(1)
+ go func() error {
+ if err := gen.translateMetadataDefs(); err != nil {
+ return errors.WithStack(err)
+ }
+ wg.Done()
+ return nil
+ }()
+ wg.Wait()
return nil
}
@mewmew
Copy link
Author

mewmew commented Nov 9, 2018

Note, errors are not handled in the above example. A proper implementation would propagate error information on channels or through other synchronization primitives.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment