Skip to content

Commit f6c2ee5

Browse files
committed
build: gen pkg to object
1 parent 6df688e commit f6c2ee5

File tree

5 files changed

+71
-44
lines changed

5 files changed

+71
-44
lines changed

internal/build/build.go

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ type Config struct {
7777
Mode Mode
7878
GenExpect bool // only valid for ModeCmpTest
7979
Verbose bool
80+
GenLL bool // generate pkg .ll files
8081
Tags string
8182
GlobalNames map[string][]string // pkg => names
8283
GlobalDatas map[string]string // pkg.name => data
@@ -797,18 +798,49 @@ func buildPkg(ctx *context, aPkg *aPackage, verbose bool) error {
797798
aPkg.LinkArgs = append(aPkg.LinkArgs, altLdflags...)
798799
}
799800
if pkg.ExportFile != "" {
800-
pkg.ExportFile += ".ll"
801-
os.WriteFile(pkg.ExportFile, []byte(ret.String()), 0644)
801+
err := exportObject(ctx, pkg, ret, verbose)
802+
if err != nil {
803+
return fmt.Errorf("export object of %v failed: %v", pkgPath, err)
804+
}
802805
if debugBuild || verbose {
803806
fmt.Fprintf(os.Stderr, "==> Export %s: %s\n", aPkg.PkgPath, pkg.ExportFile)
804807
}
805-
if IsCheckEnable() {
808+
}
809+
return nil
810+
}
811+
812+
func exportObject(ctx *context, pkg *packages.Package, ret llssa.Package, verbose bool) error {
813+
if ctx.buildConf.GenLL {
814+
pkg.ExportFile += ".ll"
815+
err := os.WriteFile(pkg.ExportFile, []byte(ret.String()), 0644)
816+
if err == nil && IsCheckEnable() {
806817
if msg, err := llcCheck(ctx.env, pkg.ExportFile); err != nil {
807818
fmt.Fprintf(os.Stderr, "==> lcc %v: %v\n%v\n", pkg.PkgPath, pkg.ExportFile, msg)
808819
}
809820
}
821+
return err
810822
}
811-
return nil
823+
if ctx.buildConf.Goos == runtime.GOOS && runtime.GOOS == "darwin" {
824+
pkg.ExportFile += ".o"
825+
data, err := ret.CodeGen(llssa.ObjectFile)
826+
if err != nil {
827+
return err
828+
}
829+
return os.WriteFile(pkg.ExportFile, data, 0644)
830+
}
831+
bcfile := pkg.ExportFile + ".ll"
832+
err := os.WriteFile(bcfile, []byte(ret.String()), 0644)
833+
if err != nil {
834+
return err
835+
}
836+
pkg.ExportFile += ".o"
837+
args := []string{"-o", pkg.ExportFile, "-c", bcfile, "-Wno-override-module"}
838+
args = append(args, ctx.crossCompile.CCFLAGS...)
839+
if verbose {
840+
fmt.Fprintln(os.Stderr, "clang", args)
841+
}
842+
cmd := ctx.compiler()
843+
return cmd.Compile(args...)
812844
}
813845

814846
func llcCheck(env *llvm.Env, exportFile string) (msg string, err error) {
@@ -1026,15 +1058,20 @@ func clFiles(ctx *context, files string, pkg *packages.Package, procFile func(li
10261058
}
10271059

10281060
func clFile(ctx *context, args []string, cFile, expFile string, procFile func(linkFile string), verbose bool) {
1029-
llFile := expFile + filepath.Base(cFile) + ".ll"
1061+
llFile := expFile + filepath.Base(cFile)
10301062
ext := filepath.Ext(cFile)
10311063

10321064
// default clang++ will use c++ to compile c file,will cause symbol be mangled
10331065
if ext == ".c" {
10341066
args = append(args, "-x", "c")
10351067
}
1036-
1037-
args = append(args, "-emit-llvm", "-S", "-o", llFile, "-c", cFile)
1068+
if ctx.buildConf.GenLL {
1069+
llFile += ".ll"
1070+
args = append(args, "-emit-llvm", "-S", "-o", llFile, "-c", cFile)
1071+
} else {
1072+
llFile += ".o"
1073+
args = append(args, "-o", llFile, "-c", cFile)
1074+
}
10381075
args = append(args, ctx.crossCompile.CCFLAGS...)
10391076
args = append(args, ctx.crossCompile.CFLAGS...)
10401077
if verbose {

internal/crosscompile/cosscompile.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ func Use(goos, goarch string, wasiThreads, changeRpath bool) (export Export, err
3636
"-Wno-override-module",
3737
"-Wl,--error-limit=0",
3838
"-fuse-ld=lld",
39-
"-Wno-override-module",
4039
}
4140

4241
// Add OS-specific flags
@@ -56,6 +55,11 @@ func Use(goos, goarch string, wasiThreads, changeRpath bool) (export Export, err
5655
case "windows": // lld-link (Windows)
5756
// TODO(lijie): Add options for Windows.
5857
default: // ld.lld (Unix)
58+
export.CCFLAGS = append(
59+
export.CCFLAGS,
60+
"-fdata-sections",
61+
"-ffunction-sections",
62+
)
5963
export.LDFLAGS = append(
6064
export.LDFLAGS,
6165
"-fdata-sections",
@@ -105,6 +109,8 @@ func Use(goos, goarch string, wasiThreads, changeRpath bool) (export Export, err
105109
"-target", targetTriple,
106110
"--sysroot=" + sysrootDir,
107111
"-resource-dir=" + libclangDir,
112+
"-matomics",
113+
"-mbulk-memory",
108114
}
109115
export.CFLAGS = []string{
110116
"-I" + includeDir,
@@ -138,6 +144,10 @@ func Use(goos, goarch string, wasiThreads, changeRpath bool) (export Export, err
138144
}
139145
// Add thread support if enabled
140146
if wasiThreads {
147+
export.CCFLAGS = append(
148+
export.CCFLAGS,
149+
"-pthread",
150+
)
141151
export.LDFLAGS = append(
142152
export.LDFLAGS,
143153
"-lwasi-emulated-pthread",

internal/llgen/llgenf.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func genFrom(pkgPath string) (build.Package, error) {
4848
conf := &build.Config{
4949
Mode: build.ModeGen,
5050
AppExt: build.DefaultAppExt(runtime.GOOS),
51+
GenLL: true,
5152
}
5253
pkgs, err := build.Do([]string{pkgPath}, conf)
5354
if err != nil {

ssa/package.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"fmt"
2121
"go/token"
2222
"go/types"
23+
"io"
24+
"os"
2325
"runtime"
2426
"strconv"
2527
"unsafe"
@@ -117,9 +119,9 @@ type aProgram struct {
117119
py *types.Package
118120
pyget func() *types.Package
119121

120-
target *Target
121-
td llvm.TargetData
122-
// tm llvm.TargetMachine
122+
target *Target
123+
td llvm.TargetData
124+
tm llvm.TargetMachine
123125
named map[string]llvm.Type
124126
fnnamed map[string]int
125127

@@ -237,7 +239,8 @@ func NewProgram(target *Target) Program {
237239
}
238240
}
239241
ctx := llvm.NewContext()
240-
td := target.targetData() // TODO(xsw): target config
242+
tm := target.targetMachine()
243+
td := tm.CreateTargetData()
241244
fnsCompiled := make(map[string]bool)
242245
/*
243246
arch := target.GOARCH
@@ -252,7 +255,7 @@ func NewProgram(target *Target) Program {
252255
is32Bits := (td.PointerSize() == 4 || is32Bits(target.GOARCH))
253256
return &aProgram{
254257
ctx: ctx, gocvt: newGoTypes(), fnsCompiled: fnsCompiled,
255-
target: target, td: td, is32Bits: is32Bits,
258+
target: target, td: td, tm: tm, is32Bits: is32Bits,
256259
ptrSize: td.PointerSize(), named: make(map[string]llvm.Type), fnnamed: make(map[string]int),
257260
linkname: make(map[string]string),
258261
}
@@ -811,16 +814,15 @@ func (p Package) createGlobalStr(v string) (ret llvm.Value) {
811814

812815
// -----------------------------------------------------------------------------
813816

814-
/*
815817
type CodeGenFileType = llvm.CodeGenFileType
816818

817819
const (
818820
AssemblyFile = llvm.AssemblyFile
819821
ObjectFile = llvm.ObjectFile
820822
)
821823

822-
func (p *Package) CodeGen(ft CodeGenFileType) (ret []byte, err error) {
823-
buf, err := p.prog.targetMachine().EmitToMemoryBuffer(p.mod, ft)
824+
func (p Package) CodeGen(ft CodeGenFileType) (ret []byte, err error) {
825+
buf, err := p.Prog.tm.EmitToMemoryBuffer(p.mod, ft)
824826
if err != nil {
825827
return
826828
}
@@ -829,26 +831,25 @@ func (p *Package) CodeGen(ft CodeGenFileType) (ret []byte, err error) {
829831
return
830832
}
831833

832-
func (p *Package) Bitcode() []byte {
834+
func (p Package) Bitcode() []byte {
833835
buf := llvm.WriteBitcodeToMemoryBuffer(p.mod)
834836
ret := buf.Bytes()
835837
buf.Dispose()
836838
return ret
837839
}
838840

839-
func (p *Package) WriteTo(w io.Writer) (int64, error) {
841+
func (p Package) WriteTo(w io.Writer) (int64, error) {
840842
n, err := w.Write(p.Bitcode())
841843
return int64(n), err
842844
}
843845

844-
func (p *Package) WriteFile(file string) (err error) {
846+
func (p Package) WriteFile(file string) (err error) {
845847
f, err := os.Create(file)
846848
if err != nil {
847849
return
848850
}
849851
defer f.Close()
850852
return llvm.WriteBitcodeToFile(p.mod, f)
851853
}
852-
*/
853854

854855
// -----------------------------------------------------------------------------

ssa/target.go

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type Target struct {
3030
GOARM string // "5", "6", "7" (default)
3131
}
3232

33-
func (p *Target) targetData() llvm.TargetData {
33+
func (p *Target) targetMachine() llvm.TargetMachine {
3434
spec := p.Spec()
3535
if spec.Triple == "" {
3636
spec.Triple = llvm.DefaultTargetTriple()
@@ -39,31 +39,9 @@ func (p *Target) targetData() llvm.TargetData {
3939
if err != nil {
4040
panic(err)
4141
}
42-
machine := t.CreateTargetMachine(spec.Triple, spec.CPU, spec.Features, llvm.CodeGenLevelDefault, llvm.RelocDefault, llvm.CodeModelDefault)
43-
return machine.CreateTargetData()
42+
return t.CreateTargetMachine(spec.Triple, spec.CPU, spec.Features, llvm.CodeGenLevelDefault, llvm.RelocPIC, llvm.CodeModelDefault)
4443
}
4544

46-
/*
47-
func (p *Program) targetMachine() llvm.TargetMachine {
48-
if p.tm.C == nil {
49-
spec := p.target.toSpec()
50-
target, err := llvm.GetTargetFromTriple(spec.triple)
51-
if err != nil {
52-
panic(err)
53-
}
54-
p.tm = target.CreateTargetMachine(
55-
spec.triple,
56-
spec.cpu,
57-
spec.features,
58-
llvm.CodeGenLevelDefault,
59-
llvm.RelocDefault,
60-
llvm.CodeModelDefault,
61-
)
62-
}
63-
return p.tm
64-
}
65-
*/
66-
6745
type TargetSpec struct {
6846
Triple string
6947
CPU string

0 commit comments

Comments
 (0)