// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package obj

import (
	"fmt"
	"math"
	"os"
	"strings"
)

// go-specific code shared across loaders (5l, 6l, 8l).

var Framepointer_enabled int

var Fieldtrack_enabled int

// Toolchain experiments.
// These are controlled by the GOEXPERIMENT environment
// variable recorded when the toolchain is built.
// This list is also known to cmd/gc.
var exper = []struct {
	name string
	val  *int
}{
	struct {
		name string
		val  *int
	}{"fieldtrack", &Fieldtrack_enabled},
	struct {
		name string
		val  *int
	}{"framepointer", &Framepointer_enabled},
}

func addexp(s string) {
	for i := 0; i < len(exper); i++ {
		if exper[i].name == s {
			if exper[i].val != nil {
				*exper[i].val = 1
			}
			return
		}
	}

	fmt.Printf("unknown experiment %s\n", s)
	os.Exit(2)
}

func linksetexp() {
	for _, f := range strings.Split(goexperiment, ",") {
		if f != "" {
			addexp(f)
		}
	}
}

// replace all "". with pkg.
func Expandpkg(t0 string, pkg string) string {
	return strings.Replace(t0, `"".`, pkg+".", -1)
}

func double2ieee(ieee *uint64, f float64) {
	*ieee = math.Float64bits(f)
}

func Nopout(p *Prog) {
	p.As = ANOP
	p.Scond = 0
	p.From = Addr{}
	p.From3 = Addr{}
	p.Reg = 0
	p.To = Addr{}
}

func Nocache(p *Prog) {
	p.Optab = 0
	p.From.Class = 0
	p.From3.Class = 0
	p.To.Class = 0
}

/*
 *	bv.c
 */

/*
 *	closure.c
 */

/*
 *	const.c
 */

/*
 *	cplx.c
 */

/*
 *	dcl.c
 */

/*
 *	esc.c
 */

/*
 *	export.c
 */

/*
 *	fmt.c
 */

/*
 *	gen.c
 */

/*
 *	init.c
 */

/*
 *	inl.c
 */

/*
 *	lex.c
 */
func Expstring() string {
	buf := "X"
	for i := range exper {
		if *exper[i].val != 0 {
			buf += "," + exper[i].name
		}
	}
	if buf == "X" {
		buf += ",none"
	}
	return "X:" + buf[2:]
}
