Source file src/cmd/link/internal/ld/util.go

     1  // Copyright 2015 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 ld
     6  
     7  import (
     8  	"cmd/link/internal/loader"
     9  	"encoding/binary"
    10  	"fmt"
    11  	"os"
    12  )
    13  
    14  var atExitFuncs []func()
    15  
    16  func AtExit(f func()) {
    17  	atExitFuncs = append(atExitFuncs, f)
    18  }
    19  
    20  // runAtExitFuncs runs the queued set of AtExit functions.
    21  func runAtExitFuncs() {
    22  	for i := len(atExitFuncs) - 1; i >= 0; i-- {
    23  		atExitFuncs[i]()
    24  	}
    25  	atExitFuncs = nil
    26  }
    27  
    28  // Exit exits with code after executing all atExitFuncs.
    29  func Exit(code int) {
    30  	runAtExitFuncs()
    31  	os.Exit(code)
    32  }
    33  
    34  // Exitf logs an error message then calls Exit(2).
    35  func Exitf(format string, a ...interface{}) {
    36  	fmt.Fprintf(os.Stderr, os.Args[0]+": "+format+"\n", a...)
    37  	nerrors++
    38  	if *flagH {
    39  		panic("error")
    40  	}
    41  	Exit(2)
    42  }
    43  
    44  // afterErrorAction updates 'nerrors' on error and invokes exit or
    45  // panics in the proper circumstances.
    46  func afterErrorAction() {
    47  	nerrors++
    48  	if *flagH {
    49  		panic("error")
    50  	}
    51  	if nerrors > 20 {
    52  		Exitf("too many errors")
    53  	}
    54  }
    55  
    56  // Errorf logs an error message without a specific symbol for context.
    57  // Use ctxt.Errorf when possible.
    58  //
    59  // If more than 20 errors have been printed, exit with an error.
    60  //
    61  // Logging an error means that on exit cmd/link will delete any
    62  // output file and return a non-zero error code.
    63  func Errorf(format string, args ...interface{}) {
    64  	format += "\n"
    65  	fmt.Fprintf(os.Stderr, format, args...)
    66  	afterErrorAction()
    67  }
    68  
    69  // Errorf method logs an error message.
    70  //
    71  // If more than 20 errors have been printed, exit with an error.
    72  //
    73  // Logging an error means that on exit cmd/link will delete any
    74  // output file and return a non-zero error code.
    75  func (ctxt *Link) Errorf(s loader.Sym, format string, args ...interface{}) {
    76  	if ctxt.loader != nil {
    77  		ctxt.loader.Errorf(s, format, args...)
    78  		return
    79  	}
    80  	// Note: this is not expected to happen very often.
    81  	format = fmt.Sprintf("sym %d: %s", s, format)
    82  	format += "\n"
    83  	fmt.Fprintf(os.Stderr, format, args...)
    84  	afterErrorAction()
    85  }
    86  
    87  func artrim(x []byte) string {
    88  	i := 0
    89  	j := len(x)
    90  	for i < len(x) && x[i] == ' ' {
    91  		i++
    92  	}
    93  	for j > i && x[j-1] == ' ' {
    94  		j--
    95  	}
    96  	return string(x[i:j])
    97  }
    98  
    99  func stringtouint32(x []uint32, s string) {
   100  	for i := 0; len(s) > 0; i++ {
   101  		var buf [4]byte
   102  		s = s[copy(buf[:], s):]
   103  		x[i] = binary.LittleEndian.Uint32(buf[:])
   104  	}
   105  }
   106  

View as plain text