1
2
3
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
21 func runAtExitFuncs() {
22 for i := len(atExitFuncs) - 1; i >= 0; i-- {
23 atExitFuncs[i]()
24 }
25 atExitFuncs = nil
26 }
27
28
29 func Exit(code int) {
30 runAtExitFuncs()
31 os.Exit(code)
32 }
33
34
35 func Exitf(format string, a ...interface{}) {
36 fmt.Fprintf(os.Stderr, os.Args[0]+": "+format+"\n", a...)
37 nerrors++
38 Exit(2)
39 }
40
41
42
43 func afterErrorAction() {
44 nerrors++
45 if *flagH {
46 panic("error")
47 }
48 if nerrors > 20 {
49 Exitf("too many errors")
50 }
51 }
52
53
54
55
56
57
58
59
60
61
62 func Errorf(dummy *int, format string, args ...interface{}) {
63 format += "\n"
64 fmt.Fprintf(os.Stderr, format, args...)
65 afterErrorAction()
66 }
67
68
69
70
71
72
73
74 func (ctxt *Link) Errorf(s loader.Sym, format string, args ...interface{}) {
75 if ctxt.loader != nil {
76 ctxt.loader.Errorf(s, format, args...)
77 return
78 }
79
80 format = fmt.Sprintf("sym %d: %s", s, format)
81 format += "\n"
82 fmt.Fprintf(os.Stderr, format, args...)
83 afterErrorAction()
84 }
85
86 func artrim(x []byte) string {
87 i := 0
88 j := len(x)
89 for i < len(x) && x[i] == ' ' {
90 i++
91 }
92 for j > i && x[j-1] == ' ' {
93 j--
94 }
95 return string(x[i:j])
96 }
97
98 func stringtouint32(x []uint32, s string) {
99 for i := 0; len(s) > 0; i++ {
100 var buf [4]byte
101 s = s[copy(buf[:], s):]
102 x[i] = binary.LittleEndian.Uint32(buf[:])
103 }
104 }
105
106
107 func contains(s []string, v string) bool {
108 for _, x := range s {
109 if x == v {
110 return true
111 }
112 }
113 return false
114 }
115
View as plain text