tools-builtin.go raw

   1  //go:build byollvm
   2  
   3  package builder
   4  
   5  import (
   6  	"errors"
   7  	"unsafe"
   8  )
   9  
  10  /*
  11  #cgo CXXFLAGS: -fno-rtti
  12  #include <stdbool.h>
  13  #include <stdlib.h>
  14  bool moxie_clang_driver(int argc, char **argv);
  15  bool moxie_link(int argc, char **argv);
  16  */
  17  import "C"
  18  
  19  const hasBuiltinTools = true
  20  
  21  // RunTool runs the given tool (such as clang).
  22  //
  23  // This version actually runs the tools because Moxie was compiled while
  24  // linking statically with LLVM (with the byollvm build tag).
  25  func RunTool(tool string, args ...string) error {
  26  	args = append([]string{tool}, args...)
  27  
  28  	var cflag *C.char
  29  	buf := C.calloc(C.size_t(len(args)), C.size_t(unsafe.Sizeof(cflag)))
  30  	defer C.free(buf)
  31  	cflags := (*[1 << 10]*C.char)(unsafe.Pointer(buf))[:len(args):len(args)]
  32  	for i, flag := range args {
  33  		cflag := C.CString(flag)
  34  		cflags[i] = cflag
  35  		defer C.free(unsafe.Pointer(cflag))
  36  	}
  37  
  38  	var ok C.bool
  39  	switch tool {
  40  	case "clang":
  41  		ok = C.moxie_clang_driver(C.int(len(args)), (**C.char)(buf))
  42  	case "ld.lld", "wasm-ld":
  43  		ok = C.moxie_link(C.int(len(args)), (**C.char)(buf))
  44  	default:
  45  		return errors.New("unknown tool: " + tool)
  46  	}
  47  	if !ok {
  48  		return errors.New("failed to run tool: " + tool)
  49  	}
  50  	return nil
  51  }
  52