Merge pull request #1228 from visualfc/dev_check
build: dev support checkLinkArgs/CheckLLFiles/GenLLFiles
This commit is contained in:
@@ -47,11 +47,7 @@ func runCmd(cmd *base.Command, args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
conf := build.NewDefaultConf(build.ModeBuild)
|
conf := build.NewDefaultConf(build.ModeBuild)
|
||||||
conf.Tags = flags.Tags
|
flags.UpdateConfig(conf)
|
||||||
conf.Verbose = flags.Verbose
|
|
||||||
conf.OutFile = flags.OutputFile
|
|
||||||
conf.Target = flags.Target
|
|
||||||
conf.AbiMode = build.AbiMode(flags.AbiMode)
|
|
||||||
|
|
||||||
args = cmd.Flag.Args()
|
args = cmd.Flag.Args()
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package flags
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/internal/build"
|
||||||
"github.com/goplus/llgo/internal/buildenv"
|
"github.com/goplus/llgo/internal/buildenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,6 +18,9 @@ var BuildEnv string
|
|||||||
var Tags string
|
var Tags string
|
||||||
var Target string
|
var Target string
|
||||||
var AbiMode int
|
var AbiMode int
|
||||||
|
var CheckLinkArgs bool
|
||||||
|
var CheckLLFiles bool
|
||||||
|
var GenLLFiles bool
|
||||||
|
|
||||||
func AddBuildFlags(fs *flag.FlagSet) {
|
func AddBuildFlags(fs *flag.FlagSet) {
|
||||||
fs.BoolVar(&Verbose, "v", false, "Verbose mode")
|
fs.BoolVar(&Verbose, "v", false, "Verbose mode")
|
||||||
@@ -25,8 +29,9 @@ func AddBuildFlags(fs *flag.FlagSet) {
|
|||||||
fs.StringVar(&Target, "target", "", "Target platform (e.g., rp2040, wasi)")
|
fs.StringVar(&Target, "target", "", "Target platform (e.g., rp2040, wasi)")
|
||||||
if buildenv.Dev {
|
if buildenv.Dev {
|
||||||
fs.IntVar(&AbiMode, "abi", 2, "ABI mode (default 2). 0 = none, 1 = cfunc, 2 = allfunc.")
|
fs.IntVar(&AbiMode, "abi", 2, "ABI mode (default 2). 0 = none, 1 = cfunc, 2 = allfunc.")
|
||||||
} else {
|
fs.BoolVar(&CheckLinkArgs, "check-linkargs", false, "check link args valid")
|
||||||
AbiMode = 2
|
fs.BoolVar(&CheckLLFiles, "check-llfiles", false, "check .ll files valid")
|
||||||
|
fs.BoolVar(&GenLLFiles, "gen-llfiles", false, "generate .ll files for pkg export")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,3 +40,21 @@ var Gen bool
|
|||||||
func AddCmpTestFlags(fs *flag.FlagSet) {
|
func AddCmpTestFlags(fs *flag.FlagSet) {
|
||||||
fs.BoolVar(&Gen, "gen", false, "Generate llgo.expect file")
|
fs.BoolVar(&Gen, "gen", false, "Generate llgo.expect file")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UpdateConfig(conf *build.Config) {
|
||||||
|
conf.Tags = Tags
|
||||||
|
conf.Verbose = Verbose
|
||||||
|
conf.Target = Target
|
||||||
|
switch conf.Mode {
|
||||||
|
case build.ModeBuild:
|
||||||
|
conf.OutFile = OutputFile
|
||||||
|
case build.ModeCmpTest:
|
||||||
|
conf.GenExpect = Gen
|
||||||
|
}
|
||||||
|
if buildenv.Dev {
|
||||||
|
conf.AbiMode = build.AbiMode(AbiMode)
|
||||||
|
conf.CheckLinkArgs = CheckLinkArgs
|
||||||
|
conf.CheckLLFiles = CheckLLFiles
|
||||||
|
conf.GenLL = GenLLFiles
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -45,9 +45,7 @@ func runCmd(cmd *base.Command, args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
conf := build.NewDefaultConf(build.ModeInstall)
|
conf := build.NewDefaultConf(build.ModeInstall)
|
||||||
conf.Tags = flags.Tags
|
flags.UpdateConfig(conf)
|
||||||
conf.Verbose = flags.Verbose
|
|
||||||
conf.AbiMode = build.AbiMode(flags.AbiMode)
|
|
||||||
|
|
||||||
args = cmd.Flag.Args()
|
args = cmd.Flag.Args()
|
||||||
_, err := build.Do(args, conf)
|
_, err := build.Do(args, conf)
|
||||||
|
|||||||
@@ -68,11 +68,7 @@ func runCmdEx(cmd *base.Command, args []string, mode build.Mode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
conf := build.NewDefaultConf(mode)
|
conf := build.NewDefaultConf(mode)
|
||||||
conf.Tags = flags.Tags
|
flags.UpdateConfig(conf)
|
||||||
conf.Verbose = flags.Verbose
|
|
||||||
conf.GenExpect = flags.Gen
|
|
||||||
conf.Target = flags.Target
|
|
||||||
conf.AbiMode = build.AbiMode(flags.AbiMode)
|
|
||||||
|
|
||||||
args = cmd.Flag.Args()
|
args = cmd.Flag.Args()
|
||||||
args, runArgs, err := parseRunArgs(args)
|
args, runArgs, err := parseRunArgs(args)
|
||||||
|
|||||||
@@ -27,10 +27,7 @@ func runCmd(cmd *base.Command, args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
conf := build.NewDefaultConf(build.ModeTest)
|
conf := build.NewDefaultConf(build.ModeTest)
|
||||||
conf.Tags = flags.Tags
|
flags.UpdateConfig(conf)
|
||||||
conf.Verbose = flags.Verbose
|
|
||||||
conf.Target = flags.Target
|
|
||||||
conf.AbiMode = build.AbiMode(flags.AbiMode)
|
|
||||||
|
|
||||||
args = cmd.Flag.Args()
|
args = cmd.Flag.Args()
|
||||||
_, err := build.Do(args, conf)
|
_, err := build.Do(args, conf)
|
||||||
|
|||||||
@@ -72,21 +72,23 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Goos string
|
Goos string
|
||||||
Goarch string
|
Goarch string
|
||||||
Target string // target name (e.g., "rp2040", "wasi") - takes precedence over Goos/Goarch
|
Target string // target name (e.g., "rp2040", "wasi") - takes precedence over Goos/Goarch
|
||||||
BinPath string
|
BinPath string
|
||||||
AppExt string // ".exe" on Windows, empty on Unix
|
AppExt string // ".exe" on Windows, empty on Unix
|
||||||
OutFile string // only valid for ModeBuild when len(pkgs) == 1
|
OutFile string // only valid for ModeBuild when len(pkgs) == 1
|
||||||
RunArgs []string // only valid for ModeRun
|
RunArgs []string // only valid for ModeRun
|
||||||
Mode Mode
|
Mode Mode
|
||||||
AbiMode AbiMode
|
AbiMode AbiMode
|
||||||
GenExpect bool // only valid for ModeCmpTest
|
GenExpect bool // only valid for ModeCmpTest
|
||||||
Verbose bool
|
Verbose bool
|
||||||
GenLL bool // generate pkg .ll files
|
GenLL bool // generate pkg .ll files
|
||||||
Tags string
|
CheckLLFiles bool // check .ll files valid
|
||||||
GlobalNames map[string][]string // pkg => names
|
CheckLinkArgs bool // check linkargs valid
|
||||||
GlobalDatas map[string]string // pkg.name => data
|
Tags string
|
||||||
|
GlobalNames map[string][]string // pkg => names
|
||||||
|
GlobalDatas map[string]string // pkg.name => data
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDefaultConf(mode Mode) *Config {
|
func NewDefaultConf(mode Mode) *Config {
|
||||||
@@ -278,14 +280,12 @@ func Do(args []string, conf *Config) ([]Package, error) {
|
|||||||
output := conf.OutFile != ""
|
output := conf.OutFile != ""
|
||||||
ctx := &context{env: env, conf: cfg, progSSA: progSSA, prog: prog, dedup: dedup,
|
ctx := &context{env: env, conf: cfg, progSSA: progSSA, prog: prog, dedup: dedup,
|
||||||
patches: patches, built: make(map[string]none), initial: initial, mode: mode,
|
patches: patches, built: make(map[string]none), initial: initial, mode: mode,
|
||||||
output: output,
|
output: output,
|
||||||
needRt: make(map[*packages.Package]bool),
|
needRt: make(map[*packages.Package]bool),
|
||||||
needPyInit: make(map[*packages.Package]bool),
|
needPyInit: make(map[*packages.Package]bool),
|
||||||
buildConf: conf,
|
buildConf: conf,
|
||||||
crossCompile: export,
|
crossCompile: export,
|
||||||
isCheckEnabled: IsCheckEnabled(),
|
cTransformer: cabi.NewTransformer(prog, conf.AbiMode),
|
||||||
isCheckLinkArgsEnabled: IsCheckLinkArgsEnabled(),
|
|
||||||
cTransformer: cabi.NewTransformer(prog, conf.AbiMode),
|
|
||||||
}
|
}
|
||||||
pkgs, err := buildAllPkgs(ctx, initial, verbose)
|
pkgs, err := buildAllPkgs(ctx, initial, verbose)
|
||||||
check(err)
|
check(err)
|
||||||
@@ -375,9 +375,6 @@ type context struct {
|
|||||||
nLibdir int
|
nLibdir int
|
||||||
output bool
|
output bool
|
||||||
|
|
||||||
isCheckEnabled bool
|
|
||||||
isCheckLinkArgsEnabled bool
|
|
||||||
|
|
||||||
needRt map[*packages.Package]bool
|
needRt map[*packages.Package]bool
|
||||||
needPyInit map[*packages.Package]bool
|
needPyInit map[*packages.Package]bool
|
||||||
|
|
||||||
@@ -485,7 +482,7 @@ func buildAllPkgs(ctx *context, initial []*packages.Package, verbose bool) (pkgs
|
|||||||
ctx.nLibdir++
|
ctx.nLibdir++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ctx.isCheckLinkArgsEnabled {
|
if ctx.buildConf.CheckLinkArgs {
|
||||||
if err := ctx.compiler().CheckLinkArgs(pkgLinkArgs, isWasmTarget(ctx.buildConf.Goos)); err != nil {
|
if err := ctx.compiler().CheckLinkArgs(pkgLinkArgs, isWasmTarget(ctx.buildConf.Goos)); err != nil {
|
||||||
panic(fmt.Sprintf("test link args '%s' failed\n\texpanded to: %v\n\tresolved to: %v\n\terror: %v", param, expdArgs, pkgLinkArgs, err))
|
panic(fmt.Sprintf("test link args '%s' failed\n\texpanded to: %v\n\tresolved to: %v\n\terror: %v", param, expdArgs, pkgLinkArgs, err))
|
||||||
}
|
}
|
||||||
@@ -1022,7 +1019,7 @@ func exportObject(ctx *context, pkgPath string, exportFile string, data []byte)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return exportFile, err
|
return exportFile, err
|
||||||
}
|
}
|
||||||
if ctx.isCheckEnabled {
|
if ctx.buildConf.CheckLLFiles {
|
||||||
if msg, err := llcCheck(ctx.env, f.Name()); err != nil {
|
if msg, err := llcCheck(ctx.env, f.Name()); err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "==> lcc %v: %v\n%v\n", pkgPath, f.Name(), msg)
|
fmt.Fprintf(os.Stderr, "==> lcc %v: %v\n%v\n", pkgPath, f.Name(), msg)
|
||||||
}
|
}
|
||||||
@@ -1162,11 +1159,9 @@ const llgoDebug = "LLGO_DEBUG"
|
|||||||
const llgoDbgSyms = "LLGO_DEBUG_SYMBOLS"
|
const llgoDbgSyms = "LLGO_DEBUG_SYMBOLS"
|
||||||
const llgoTrace = "LLGO_TRACE"
|
const llgoTrace = "LLGO_TRACE"
|
||||||
const llgoOptimize = "LLGO_OPTIMIZE"
|
const llgoOptimize = "LLGO_OPTIMIZE"
|
||||||
const llgoCheck = "LLGO_CHECK"
|
|
||||||
const llgoWasmRuntime = "LLGO_WASM_RUNTIME"
|
const llgoWasmRuntime = "LLGO_WASM_RUNTIME"
|
||||||
const llgoWasiThreads = "LLGO_WASI_THREADS"
|
const llgoWasiThreads = "LLGO_WASI_THREADS"
|
||||||
const llgoStdioNobuf = "LLGO_STDIO_NOBUF"
|
const llgoStdioNobuf = "LLGO_STDIO_NOBUF"
|
||||||
const llgoCheckLinkArgs = "LLGO_CHECK_LINKARGS"
|
|
||||||
const llgoFullRpath = "LLGO_FULL_RPATH"
|
const llgoFullRpath = "LLGO_FULL_RPATH"
|
||||||
|
|
||||||
const defaultWasmRuntime = "wasmtime"
|
const defaultWasmRuntime = "wasmtime"
|
||||||
@@ -1207,18 +1202,10 @@ func IsOptimizeEnabled() bool {
|
|||||||
return isEnvOn(llgoOptimize, true)
|
return isEnvOn(llgoOptimize, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsCheckEnabled() bool {
|
|
||||||
return isEnvOn(llgoCheck, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsWasiThreadsEnabled() bool {
|
func IsWasiThreadsEnabled() bool {
|
||||||
return isEnvOn(llgoWasiThreads, true)
|
return isEnvOn(llgoWasiThreads, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsCheckLinkArgsEnabled() bool {
|
|
||||||
return isEnvOn(llgoCheckLinkArgs, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsFullRpathEnabled() bool {
|
func IsFullRpathEnabled() bool {
|
||||||
return isEnvOn(llgoFullRpath, true)
|
return isEnvOn(llgoFullRpath, true)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user