//===- main.go - Clang compiler wrapper for building libgo ----------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This is a wrapper for Clang that passes invocations with -fdump-go-spec to
// GCC, and rewrites -fplan9-extensions to -fms-extensions. It is intended to
// go away once libgo's build no longer uses these flags.
//
//===----------------------------------------------------------------------===//

package main

import (
	"fmt"
	"os"
	"os/exec"
	"strings"
)

func runproc(name string, argv []string) {
	path, err := exec.LookPath(name)
	if err != nil {
		fmt.Fprintf(os.Stderr, "cc-wrapper: could not find %s: %v\n", name, err)
		os.Exit(1)
	}

	proc, err := os.StartProcess(path, append([]string{name}, argv...), &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
	})
	if err != nil {
		fmt.Fprintf(os.Stderr, "cc-wrapper: could not start %s: %v\n", name, err)
		os.Exit(1)
	}

	state, err := proc.Wait()
	if err != nil {
		fmt.Fprintf(os.Stderr, "cc-wrapper: could not wait for %s: %v\n", name, err)
		os.Exit(1)
	}

	if state.Success() {
		os.Exit(0)
	} else {
		os.Exit(1)
	}
}

func main() {
	newargs := make([]string, len(os.Args)-1)
	for i, arg := range os.Args[1:] {
		switch {
		case strings.HasPrefix(arg, "-fdump-go-spec"):
			runproc("gcc", os.Args[1:])

		case arg == "-fplan9-extensions":
			newargs[i] = "-fms-extensions"
			newargs = append(newargs, "-Wno-microsoft")

		default:
			newargs[i] = arg
		}
	}

	ccargs := strings.Split(os.Getenv("REAL_CC"), "@SPACE@")
	runproc(ccargs[0], append(ccargs[1:], newargs...))
}
