forked from lug/matterbridge
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // go-specific code shared across loaders (5l, 6l, 8l).
 | |
| 
 | |
| var (
 | |
| 	framepointer_enabled int
 | |
| 	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
 | |
| }{
 | |
| 	{"fieldtrack", &Fieldtrack_enabled},
 | |
| 	{"framepointer", &framepointer_enabled},
 | |
| }
 | |
| 
 | |
| func addexp(s string) {
 | |
| 	// Could do general integer parsing here, but the runtime copy doesn't yet.
 | |
| 	v := 1
 | |
| 	name := s
 | |
| 	if len(name) > 2 && name[:2] == "no" {
 | |
| 		v = 0
 | |
| 		name = name[2:]
 | |
| 	}
 | |
| 	for i := 0; i < len(exper); i++ {
 | |
| 		if exper[i].name == name {
 | |
| 			if exper[i].val != nil {
 | |
| 				*exper[i].val = v
 | |
| 			}
 | |
| 			return
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	fmt.Printf("unknown experiment %s\n", s)
 | |
| 	os.Exit(2)
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	framepointer_enabled = 1 // default
 | |
| 	for _, f := range strings.Split(goexperiment, ",") {
 | |
| 		if f != "" {
 | |
| 			addexp(f)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Framepointer_enabled(goos, goarch string) bool {
 | |
| 	return framepointer_enabled != 0 && goarch == "amd64" && goos != "nacl"
 | |
| }
 | |
| 
 | |
| func Nopout(p *Prog) {
 | |
| 	p.As = ANOP
 | |
| 	p.Scond = 0
 | |
| 	p.From = Addr{}
 | |
| 	p.From3 = nil
 | |
| 	p.Reg = 0
 | |
| 	p.To = Addr{}
 | |
| }
 | |
| 
 | |
| 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:]
 | |
| }
 | 
