Home | History | Annotate | Download | only in obj
      1 // Copyright 2009 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 package obj
      6 
      7 import (
      8 	"fmt"
      9 	"os"
     10 	"strings"
     11 )
     12 
     13 // go-specific code shared across loaders (5l, 6l, 8l).
     14 
     15 var (
     16 	Framepointer_enabled int
     17 	Fieldtrack_enabled   int
     18 )
     19 
     20 // Toolchain experiments.
     21 // These are controlled by the GOEXPERIMENT environment
     22 // variable recorded when the toolchain is built.
     23 // This list is also known to cmd/gc.
     24 var exper = []struct {
     25 	name string
     26 	val  *int
     27 }{
     28 	{"fieldtrack", &Fieldtrack_enabled},
     29 	{"framepointer", &Framepointer_enabled},
     30 }
     31 
     32 func addexp(s string) {
     33 	for i := 0; i < len(exper); i++ {
     34 		if exper[i].name == s {
     35 			if exper[i].val != nil {
     36 				*exper[i].val = 1
     37 			}
     38 			return
     39 		}
     40 	}
     41 
     42 	fmt.Printf("unknown experiment %s\n", s)
     43 	os.Exit(2)
     44 }
     45 
     46 func init() {
     47 	for _, f := range strings.Split(goexperiment, ",") {
     48 		if f != "" {
     49 			addexp(f)
     50 		}
     51 	}
     52 }
     53 
     54 func Nopout(p *Prog) {
     55 	p.As = ANOP
     56 	p.Scond = 0
     57 	p.From = Addr{}
     58 	p.From3 = nil
     59 	p.Reg = 0
     60 	p.To = Addr{}
     61 }
     62 
     63 func Nocache(p *Prog) {
     64 	p.Optab = 0
     65 	p.From.Class = 0
     66 	if p.From3 != nil {
     67 		p.From3.Class = 0
     68 	}
     69 	p.To.Class = 0
     70 }
     71 
     72 func Expstring() string {
     73 	buf := "X"
     74 	for i := range exper {
     75 		if *exper[i].val != 0 {
     76 			buf += "," + exper[i].name
     77 		}
     78 	}
     79 	if buf == "X" {
     80 		buf += ",none"
     81 	}
     82 	return "X:" + buf[2:]
     83 }
     84