Source file src/simd/archsimd/_gen/cmd/specls/main.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // specls prints the expanded API from the SIMD spec package.
     6  package main
     7  
     8  import (
     9  	"flag"
    10  	"fmt"
    11  	"go/ast"
    12  	"log"
    13  	"os"
    14  	"regexp"
    15  	"simd/archsimd/_gen/specgen"
    16  )
    17  
    18  var (
    19  	flagFilter = flag.String("f", "", "only process spec functions matching `regexp`")
    20  	flagTrace  = flag.Bool("trace", false, "trace solver steps")
    21  )
    22  
    23  func main() {
    24  	flag.Usage = func() {
    25  		w := flag.CommandLine.Output()
    26  		fmt.Fprintf(w, "usage: specls [flags] [spec dir]\n")
    27  		flag.CommandLine.PrintDefaults()
    28  	}
    29  
    30  	flag.Parse()
    31  	var specDir string
    32  	switch flag.NArg() {
    33  	case 0:
    34  		specDir = specgen.MustFindSpecDir()
    35  	case 1:
    36  		specDir = flag.Arg(0)
    37  	default:
    38  		flag.Usage()
    39  		os.Exit(1)
    40  	}
    41  
    42  	var opts specgen.LoadOptions
    43  	if *flagFilter != "" {
    44  		re, err := regexp.Compile(*flagFilter)
    45  		if err != nil {
    46  			log.Fatal("invalid -f: ", err)
    47  		}
    48  		opts.Filter = func(fd *ast.FuncDecl) bool {
    49  			return re.MatchString(fd.Name.Name)
    50  		}
    51  	}
    52  	if *flagTrace {
    53  		opts.Trace = os.Stderr
    54  	}
    55  
    56  	funcs, err := specgen.Load(specDir, &opts)
    57  	if err != nil {
    58  		fmt.Fprintf(os.Stderr, "%s\n\n", err.Error())
    59  		defer os.Exit(1)
    60  	}
    61  
    62  	for _, fn := range funcs {
    63  		fmt.Print(fn.Decl())
    64  		fmt.Println()
    65  	}
    66  }
    67  

View as plain text